管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。( m+ j+ d0 |& a) D( R. t ^& [
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- P9 U. Q: ]0 G: S2 b
Talk is cheak , show me the code.
( B3 ^! D' x- N \9 f服务端代码:1 |2 V6 s% S2 K- J9 `
- #include<stdlib.h>/ C2 ~% I2 d- C% K
- #include<WinSock2.h>) S% _: x, c# A* H
- #pragma comment(lib,"ws2_32.lib")6 ]0 Y$ n0 Z+ ^& w; G: k/ j& a# O9 h
- int main(){& j0 _. ?$ t& Q
- WSADATA wsd;/ N$ e. H& p- t0 u, H/ z9 h
- SOCKET sockServer;
0 ~6 K7 T& ^: V4 c( Q+ g. v5 x" `+ u- ] - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
$ | _( J- h: Z. g2 L5 ? - SOCKET sockClient;
8 r2 x$ r, d* j8 z j - SOCKADDR_IN clientaddr;
$ L4 W: H! t8 r - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口# p0 h( [3 c2 c7 [9 A
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: K! w& M4 R9 F0 j* y0 p6 {+ L
- 9 }' l6 |3 ]. h. k9 i
- " `5 d9 w) f7 A9 U" [0 j
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
' t) T0 m$ v1 z2 Q - printf("Socket has been created :%d", sockServer);
O* r" H0 b3 T) n/ P - }
5 [" b1 t) F. M( w! a- g! F - else{1 w' f5 p) F" H8 P+ K
- printf("Socket create failed.");! Z, b. L5 V( S5 I" z
- exit(0);' w" r- V/ {6 Q! x, G
- }% S8 G6 M( |! v$ C" p
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ g- e5 q7 \8 g2 A1 F - serveraddr.sin_family = AF_INET;
6 R" m6 @2 {2 P. [, u- a - serveraddr.sin_port = htons(6000);//绑定端口6000
0 r, e1 z Q1 r; g% i) A+ L - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));7 Z% ^6 R4 E* V
- char recvBuf[100];) p; A0 l- f/ Y( t5 K5 ]+ {3 c
- int len = sizeof(SOCKADDR);
, b0 ]8 i5 ^" ?8 j2 S - listen(sockServer, 5);//5为等待连接数5 b! ~+ H: z7 X* V2 X" I
- while (1){4 ?4 G( y* m, ~% I* w @
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);6 j* D! p! p4 ?* W
- //接收客户端数据. P$ m/ h! y3 l6 D8 V+ g+ |7 H
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);+ S W, G# R- P
- printf("to me:%s\n",recvBuf);
2 S+ M% K1 ~# x/ `; H h9 ? - memset(recvBuf, 0, 100);+ c! Q R) Z, u/ X; G$ w
- }4 L; M5 ^/ ^! f: i! `* l
- closesocket(sockClient);
3 E/ u; \! W" ^& g0 p; x - system("pause");
: ]; z. \! _! ~5 } - return 0;
2 g+ n5 a1 J5 j8 w+ f. j' S - }
复制代码 客户端代码:
; z7 r* I9 C# C8 I5 [- #include<winsock2.h>
5 |4 ^1 \. x7 | x" @! e' @ - #include<stdio.h>
9 V1 X/ g2 r0 B - #pragma comment(lib, "ws2_32.lib")
- n k6 |: H7 U. B3 Z$ ^ - void main()
. X1 u0 E7 Q3 Q1 u - {- D7 P9 `( h% C( B! ^. P. l
- WSADATA wsaData;
$ @: g4 Z+ I9 Z' {# ~% n) v6 E" l8 W - SOCKET sockClient;//客户端Socket5 w9 l8 S0 p0 _+ P
- SOCKADDR_IN addrServer;//服务端地址
/ O. i( P( E5 X; I f0 A - WSAStartup(MAKEWORD(2, 2), &wsaData);8 N. T7 A% \. z' _0 z5 H. `7 k- }
- char message[20] = "HelloSocket!";& X6 \( M0 U7 @# _2 M7 M! s# z9 A: _( T
- //定义要连接的服务端地址
$ |' G2 Y1 E5 y" i* i0 A4 U, j - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
( i6 a) ^+ d+ B - addrServer.sin_family = AF_INET;
" f0 [ ~- d3 l2 ^ - addrServer.sin_port = htons(6000);//连接端口6000
. \9 n. N3 ~6 B# w J+ [- G4 g! x - //新建客户端socket
- s/ Z0 `, O4 |! G1 Y' h7 e - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);+ M0 [+ I5 S$ ?) R m
- int s = 0;8 M% j2 v! W$ Q- \+ m% g" D9 K! S
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
" r4 a, L$ u4 ]& N; {# L: i T - ! ?$ j% m/ J' d5 k( T
- while (1){4 A. L+ F- \. ]6 R
- //发送数据
- f: o/ a7 v& F0 t, r - int a = send(sockClient, message, strlen(message) + 1, 0);8 s: w+ K, A7 |
- printf("to server:");0 y9 i. Q- j2 ?8 \( Z
- scanf("%s", message);5 v5 M) K$ p* t; n, s/ O
- " T, h$ D$ Z% X I
- }" z! E- _" m: W. L
- //关闭socket( e/ N$ i: X/ ?, g0 L* T
- closesocket(sockClient);
2 k1 x- r5 G/ ? - WSACleanup();
4 g- g& g+ c4 ^ - }
复制代码 求懂的高手来解答一下。
% B% k# \8 @/ F% }+ C# ^9 c谢谢了!
' O5 j% W" q: @9 J# H2 J) ^+ r/ ~/ A! @
7 k1 M: w9 l7 q" Q' i
7 Q4 j; N f; }6 H% [) d! L |
|