大家好,感谢你的回复。
: K8 T+ m6 u; ]5 h我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 w3 t9 ^8 K6 u
Talk is cheak , show me the code.# a y6 a7 d3 J' c b
服务端代码:$ W7 x$ L* s- C x- }
- #include<stdlib.h>. I4 ]- V7 |4 w3 {- F
- #include<WinSock2.h>" V8 j, z/ t" H1 l4 h8 ?$ i! F
- #pragma comment(lib,"ws2_32.lib")5 N2 _+ d2 n+ f& i6 ~7 `% f
- int main(){4 W0 J2 o1 K, i+ H, |! u
- WSADATA wsd;
* _0 l- G! @" o- r W3 ? - SOCKET sockServer;5 m7 c, S- y1 x! X4 G: M
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
1 a) C- ~& p- U - SOCKET sockClient;6 ?( O6 U. h M- ]
- SOCKADDR_IN clientaddr;
5 s* _ b9 N/ V% `0 ]' p - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
3 O8 d- G6 N v8 W( C2 j( m - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ p: B% H( Q V: @( @. u @
- $ t5 m3 q! V* m5 N! Q. J
- + G$ U3 |; E' k" V7 [ W$ r
- if (sockServer != -1 && sockServer != INVALID_SOCKET){; M* p, Y* b4 D* ?7 n f. f' m
- printf("Socket has been created :%d", sockServer);8 t8 j! z" D# Q$ y
- }. j% {4 h1 p U {; c" E
- else{0 A& A" Z/ d2 B: G2 b% i
- printf("Socket create failed.");
3 r; V7 ?! @& x+ U" }, T' @! l - exit(0);2 R( n4 R# \( l) a | R" o
- }: |0 W" ?, o+ _2 p$ j
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);. E7 p& ~" W- D0 T" a
- serveraddr.sin_family = AF_INET;7 H# Q2 R4 _2 Y6 w0 t! H6 g5 o. ]. g
- serveraddr.sin_port = htons(6000);//绑定端口6000. }! H2 K; m" j; Q0 x7 w
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));9 m' S7 T" T5 c: r2 {$ d, E' {
- char recvBuf[100];" F' ~8 m' u) x9 @% K$ C
- int len = sizeof(SOCKADDR);/ ]' @: B$ q' p6 q9 } I
- listen(sockServer, 5);//5为等待连接数/ c4 O2 Q' d% ^0 i, \
- while (1){
4 A& [+ m6 w! l# E2 p! y - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);- j7 j. ^5 B E1 R0 K( h0 C1 {
- //接收客户端数据: k) @6 U' n- ]- A5 L5 L
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 a( K- a+ }5 g( n. p+ e
- printf("to me:%s\n",recvBuf);
6 Y' k' G1 t& o7 x$ ], x" A - memset(recvBuf, 0, 100);
- r$ g. q* m+ v4 k" Q- j: k; f - }
9 |2 i7 X4 c* @3 u1 ~ - closesocket(sockClient);
5 s9 B- ^9 G% @1 k - system("pause");
, y4 g5 L+ r/ W* k - return 0;
1 A! [ j, \3 O" I% I# l - }
复制代码 客户端代码:: h+ p2 z2 Y) `+ u
- #include<winsock2.h>, J2 [: w% C( _
- #include<stdio.h>
. l" L. w0 p4 }5 | M5 s- g5 A) t; G - #pragma comment(lib, "ws2_32.lib")0 `, Z ~ |2 E6 K# u# @
- void main()7 X& ^, d+ }( @
- {2 l( G1 h! V3 w
- WSADATA wsaData;
1 F* T9 ~$ ?, [6 T - SOCKET sockClient;//客户端Socket$ ^0 Z- w: m- w& }3 e, T; {: i
- SOCKADDR_IN addrServer;//服务端地址' o* i( Z5 d% @- u0 ]/ D% l
- WSAStartup(MAKEWORD(2, 2), &wsaData); O" Z% l4 s! a' q ]3 {% t
- char message[20] = "HelloSocket!";9 i4 t% i4 Z0 z' J6 s
- //定义要连接的服务端地址9 f) T8 S- i; l% D4 }
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
" r) G4 N! U2 G - addrServer.sin_family = AF_INET;
0 w7 z# b3 h2 D- A0 @! d8 e! O# Q - addrServer.sin_port = htons(6000);//连接端口6000
# F0 `" ]5 I1 i5 G( j - //新建客户端socket
% {& j! ~& Y9 E F+ h - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
) M- d+ Q4 z! M8 `% A6 w t - int s = 0;4 V, l6 e$ X0 ]- h" X" m
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));+ e3 Y+ v( e# N/ g1 e
7 f* t: Y8 T1 e$ ^( B- while (1){
+ S3 V! A; h& J6 Z8 E! { - //发送数据" I: S U7 i6 I9 P& C
- int a = send(sockClient, message, strlen(message) + 1, 0);
0 J5 @) x q, Y5 k! s - printf("to server:");3 t" q6 @& m7 X& X4 M4 n% ~) `
- scanf("%s", message);; d/ ~. |3 n2 l- `3 V7 n4 o6 Y
- N4 M2 B- N3 C ?' d6 \- }& y6 _! F2 L) |+ R. H* ]
- //关闭socket
* G" F/ ]+ @& z7 `5 C, P' r% k7 B2 f - closesocket(sockClient);& r" ]$ f+ G7 B9 d
- WSACleanup();* M, l, w9 g) S; k) V' Y
- }
复制代码 求懂的高手来解答一下。
' g q1 N9 a6 P. z' Q8 b4 X' B谢谢了!
! a" S" U( S: w' ?' k8 e$ c4 J" j3 K' a
; g, ?8 o6 l$ B- D/ d* ^6 j. o4 l
, R$ } ~) G' V u2 s( n+ @ |