管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。9 N) X. w3 V+ k: X: h O9 |
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
1 x0 |) [( Z8 iTalk is cheak , show me the code." M2 J5 E4 f" A( T' X9 m5 d/ ]) d
服务端代码:8 ^# ^7 D& ?7 z e
- #include<stdlib.h>
7 G f. a: E7 H# Q h0 o5 x1 y0 O% @ - #include<WinSock2.h>" r" E- x! }: ^
- #pragma comment(lib,"ws2_32.lib")
7 C7 _. e- [( |, a# N - int main(){/ g" u) H( S+ n5 h9 h0 E, x
- WSADATA wsd;0 K- J! E0 I' |5 P; d0 _5 T) ~( d
- SOCKET sockServer;/ Y; I* _+ ~, p0 c1 ? K+ \
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号# F8 w3 T: ]" Y3 w* `. E% i3 T; x
- SOCKET sockClient;
) F8 S8 w0 I) ^$ k - SOCKADDR_IN clientaddr;
B$ D/ H4 a' [ T3 f - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* f( a W+ P+ \& A8 x- s3 ~
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
8 a/ J5 x- c: e7 r# S" Q$ l: p9 Q - & _* [3 m9 e5 a0 z: e
- ; [+ L8 b) k. _$ c' q# R) c! x9 @" O! O
- if (sockServer != -1 && sockServer != INVALID_SOCKET){: a# S$ r' s+ j4 _( L' g1 @
- printf("Socket has been created :%d", sockServer);- ?+ V* i# v8 G+ q/ C1 T9 ?
- }/ ?0 \# ~' L' e i N' c
- else{) k9 e+ q* ^4 j
- printf("Socket create failed.");7 f9 S4 C2 L5 ?' v8 C9 E" j6 |. R/ y$ B' T
- exit(0);
[0 p1 J0 S. U: t I - }
, B- d( s! c7 n% N h - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);2 p, g( O! P4 t, k. N3 i6 e: T
- serveraddr.sin_family = AF_INET;3 s: x0 G- i/ d+ U
- serveraddr.sin_port = htons(6000);//绑定端口6000: {7 c. [) K6 r$ ?
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));" Z: g' G5 {5 N8 P: i
- char recvBuf[100];
" U) T8 u3 D) o6 _ - int len = sizeof(SOCKADDR); U" T) A, A& e6 n
- listen(sockServer, 5);//5为等待连接数$ }! D3 i# D9 W* k$ N- F i4 b8 v
- while (1){
% O6 z9 J3 q( X - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
7 X8 l% ]# r- n& J% u% T. e8 f& f% B - //接收客户端数据
1 r7 ]7 J( y8 H - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
( ^7 O* e2 }- e% Q% |4 P7 ~ - printf("to me:%s\n",recvBuf);
4 U+ V3 U O8 I - memset(recvBuf, 0, 100);
+ {5 I. r& ]' d$ L - }+ U; ]# U: {6 s# }
- closesocket(sockClient);- {9 J0 x7 e ~! p! @& u$ a
- system("pause");$ E. {+ `$ l0 a+ j0 u$ ~
- return 0;
3 T( J' t, ~2 k$ H+ B$ C - }
复制代码 客户端代码:
, A* e+ s1 ?' D3 `- #include<winsock2.h>4 ^( E2 ^' g1 M4 G/ I% [/ m1 J
- #include<stdio.h>3 ?" |' d/ M* l, |
- #pragma comment(lib, "ws2_32.lib")1 f, u( n/ M$ U7 \, y
- void main()3 U+ M1 {6 L5 J8 h( d
- {% _& b8 M8 ^8 S3 T
- WSADATA wsaData;2 r/ D* M* i7 X% w% k% @
- SOCKET sockClient;//客户端Socket
6 A( w3 I4 L8 n7 ~" r; y1 { - SOCKADDR_IN addrServer;//服务端地址
2 ?% g% C" G2 d- v# Y+ G - WSAStartup(MAKEWORD(2, 2), &wsaData);
9 Z/ m& [& c* }' V& y% A9 [ - char message[20] = "HelloSocket!";
$ m+ N* b. e, W. N( F8 ]" C - //定义要连接的服务端地址: }0 M2 Z( P- C; l( l, V
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
1 D) |( f% T1 u2 G - addrServer.sin_family = AF_INET;
9 W7 S$ `4 v1 m4 z, w2 C; W0 V7 d - addrServer.sin_port = htons(6000);//连接端口6000
3 k! v2 a0 R& l! J' B - //新建客户端socket6 q: _- e2 E+ [/ B- d
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; m' T: f* U8 {6 _
- int s = 0; v8 H* T6 B2 V+ A
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));1 p+ n4 `% O0 w/ r
( c- \; g2 K& [ C1 x- while (1){ m: v2 I+ }7 M, F5 H# `
- //发送数据+ c+ V0 K) v4 O9 ?8 x2 J
- int a = send(sockClient, message, strlen(message) + 1, 0);1 h+ T! V: j6 g7 J! ?
- printf("to server:");( u- O; S! F q8 Q: I4 ^
- scanf("%s", message);) V6 b, P% q& W9 p
# `; w7 Z B: l7 j) f, n- }
( r$ A1 X* F$ L1 I+ B - //关闭socket5 c& `: \; |& |
- closesocket(sockClient);
1 [! [2 i! |* k& u V - WSACleanup();- N6 W K$ N" d3 D
- }
复制代码 求懂的高手来解答一下。, h8 ~8 u$ G W, x
谢谢了!1 U2 i' Y8 W# Q/ t6 ?7 O J
% p& G& v% d: _3 @4 c# G
. `& D" Y& t! e( g; o
8 |: }+ A# Z/ \# a2 G) t8 B$ V |
|