管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。5 ^3 r' r6 {' p* P# o4 z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。9 `2 F5 _7 S& s* |4 U `; O. s/ h
Talk is cheak , show me the code.
5 x) M N5 X* A- @5 _# @$ j服务端代码:& @* N- [5 w# I& G0 S
- #include<stdlib.h>
7 }2 y3 h8 c' e3 P k' ?8 n) V - #include<WinSock2.h>
* f8 ^4 u2 E! k+ C - #pragma comment(lib,"ws2_32.lib")
" F3 C, J" h9 X9 V2 y - int main(){' y1 F9 Z0 u. F
- WSADATA wsd;
) d3 n% P! q2 P - SOCKET sockServer;
1 \, a2 ?( y6 C5 r K% L - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
4 W# j2 I& [1 Y+ V, h - SOCKET sockClient;9 ^3 `* V$ I0 P/ \( S6 _: g5 H
- SOCKADDR_IN clientaddr;
( e, K/ a4 M9 H4 u$ F - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
8 U$ \' H+ A0 g$ ]' O! Z$ a - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
6 B! M9 m, K' [1 k; n( K" P5 K( v - 0 @( d1 V! I! o; f1 i" [
7 e: \% ?6 @, s0 ^- if (sockServer != -1 && sockServer != INVALID_SOCKET){7 M0 T% N$ [/ {
- printf("Socket has been created :%d", sockServer);
; f% G: ^; U# h( g; a1 ^. f - }
/ v1 A9 ?! U4 t - else{$ N" f8 D. u/ ]8 n; f" T
- printf("Socket create failed.");& C' e& B9 |; v5 |) a6 |' W0 ~/ p8 ?* f
- exit(0);
4 D" f; T0 {9 ~ Z# D - }% K' w6 n! u: }5 ?
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; l" q. ~, s* T E! ?& }# G
- serveraddr.sin_family = AF_INET;$ N7 _7 j" U3 \
- serveraddr.sin_port = htons(6000);//绑定端口6000- w2 [1 P) z/ c, p
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
0 c! \# {# w4 ]( \+ I, H" N: n - char recvBuf[100];+ Z; B Q( n6 m4 u
- int len = sizeof(SOCKADDR);
& Y' p6 p4 z F; G - listen(sockServer, 5);//5为等待连接数
9 Y# [3 W' f# }* \$ t - while (1){9 F6 ^; Z2 N `1 s
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
1 Z7 ?& x) w5 e4 c8 Q - //接收客户端数据- s) `1 z- K5 R' Y6 w$ Q
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% f0 c' ]8 F5 r6 ]2 G! P6 l5 U
- printf("to me:%s\n",recvBuf);+ V$ C8 g" G& r: z. {
- memset(recvBuf, 0, 100);
+ T( y" ?- h X" p" I - }
4 Q: t" q9 |. v8 m0 D0 z! ^ - closesocket(sockClient);
0 l* P' {" _" X5 r% P2 \- C - system("pause");
% _4 V% ~: E- y - return 0;
. r5 m9 ~% t) m' F% ] - }
复制代码 客户端代码:& o9 Z* Z9 |& L+ P. s3 Y" a0 I! L* V
- #include<winsock2.h>
0 G+ C, N. @' l5 h+ m7 I$ |' b4 a - #include<stdio.h>
1 D) J8 J' n: c5 j - #pragma comment(lib, "ws2_32.lib")
. v4 D) _5 W- U% q; G - void main()
, D( B* A m5 M2 {6 c, } - {
" i2 s( }) W2 a2 ~ - WSADATA wsaData;* e! r4 }* A) c4 Q" G) H9 O/ P; o9 U
- SOCKET sockClient;//客户端Socket: v2 e" _' P/ M
- SOCKADDR_IN addrServer;//服务端地址
% N# x6 l& b% P. O6 V9 @ - WSAStartup(MAKEWORD(2, 2), &wsaData);$ x/ h% [0 O& v
- char message[20] = "HelloSocket!";
/ K" w, K. W' l, h( v% |8 Y5 t& e - //定义要连接的服务端地址
6 U( a6 P7 ?; w* t9 K! C - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)" C% l5 v9 G& Y2 ~: O" U# w
- addrServer.sin_family = AF_INET;
8 ?. H+ h8 O) Z5 `1 ` - addrServer.sin_port = htons(6000);//连接端口6000
2 g5 A0 I @- M3 H1 \. @ - //新建客户端socket
- l# g# `" Y4 t" Z& |5 } - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% W, C" t; c; y6 g) H- A- r9 n. i# r
- int s = 0;
7 u* R2 p4 G. j, W) u - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
. j# _8 F! V) q6 o9 e2 ~( e - / b( k7 `5 {" W0 m% Y
- while (1){
; Y( S/ A: n8 @" }3 ]6 {- ` - //发送数据
( \0 b0 d8 p; C - int a = send(sockClient, message, strlen(message) + 1, 0);
- n- K: u) C$ h* `+ T3 D. H - printf("to server:");/ s* M+ T. d) i# E% U
- scanf("%s", message);
( B; J k% D0 v {7 X - 3 ~ s7 c* p; |" Z; Z# H# e8 g
- }
7 }4 O. ~1 f; p - //关闭socket! y3 T. {" w1 f2 m) \. T6 c
- closesocket(sockClient);
6 m/ g' P3 s6 {0 I: u. i - WSACleanup();
, b) m2 _ S% l - }
复制代码 求懂的高手来解答一下。% N, j: Q# Q u' L
谢谢了!: J3 |1 g X( X1 L Y |1 q! s0 q
& U' c j3 p; `- o4 M3 U5 w6 p, [( V4 U+ m5 G2 e. [* ~; \: T
2 H' v' a! ?, i% W) K7 [
|
|