管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。, W1 ?* |. h2 V0 V1 g
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 }2 c/ |; d; `Talk is cheak , show me the code.0 H1 [0 w* u5 F: ]0 F6 v7 @
服务端代码:5 m0 B% ~7 R9 V+ o) V5 [4 Z2 m$ }
- #include<stdlib.h>/ P) k) o( Q9 b
- #include<WinSock2.h>( I! [, |6 h M! x; _( J
- #pragma comment(lib,"ws2_32.lib")
( m% b4 C+ S0 X$ V- x - int main(){1 N$ s1 S+ Q) S7 ?) @) {( i
- WSADATA wsd;/ K4 c0 d" u4 |5 h2 a
- SOCKET sockServer;
( P+ N c2 z% q9 g3 } - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
5 \* V/ }! P, ~# r+ V; T/ v. r0 S1 J2 R" s - SOCKET sockClient;
& z3 B4 s) R! h - SOCKADDR_IN clientaddr;
8 x- f! M8 v* O- S0 A, Y- J - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
9 h3 e2 i) V% p - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
6 Y1 a% X8 I4 E3 A9 S
5 t# K: h* y3 W0 |- u- I0 p& n; [" ~
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
) V& e5 o w7 A" J - printf("Socket has been created :%d", sockServer);( N: @- s/ l6 m( p" H0 R
- }
9 X: O% w$ E) J- N$ {0 `3 u - else{
7 z- [$ `" ~! B$ k* U6 u* R( x/ p - printf("Socket create failed.");
* ?6 O9 Q; {5 y% l8 `8 X - exit(0);
' R6 d( s2 ?1 V7 E: g5 U - }# t. L2 G: g# L2 B) t' |7 m- S
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
: A/ j- @" m. C' d0 F - serveraddr.sin_family = AF_INET;
7 H, c) I- h% ^$ o8 n - serveraddr.sin_port = htons(6000);//绑定端口6000$ s3 D4 a1 {) K! U! Q- g
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
# u$ }+ q0 n3 ` - char recvBuf[100];
5 L; |/ y9 [) L- ]; N2 E - int len = sizeof(SOCKADDR);
; Y5 Q' D. E/ [7 t6 {/ ^: I6 L6 s - listen(sockServer, 5);//5为等待连接数+ ~" N- q- @* D' [& T$ Q
- while (1){8 _1 G% {% P$ L+ B
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);, t7 F& O$ F) ?% N: h3 |8 n
- //接收客户端数据* {5 G5 A; }# q% |0 k
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& `# R+ S* N ~; K/ [ - printf("to me:%s\n",recvBuf);
n+ x' C& W7 j/ O: U; w: H - memset(recvBuf, 0, 100);* ?$ }3 d3 m* A: c9 [, x" @
- }
' P8 y) o8 v$ P4 o' E - closesocket(sockClient);
% p* A# ?5 w' g' q2 B9 w& S, x - system("pause");9 `8 W: X9 s3 c3 Y( C
- return 0;
" y9 b0 \' O' ^! m* Q( j - }
复制代码 客户端代码:
6 m3 |! g4 |& O- #include<winsock2.h>+ h" V7 L& ]3 ]/ U" Z- m; t
- #include<stdio.h>7 g$ [+ `$ E' C5 }2 o$ M( f& }
- #pragma comment(lib, "ws2_32.lib")! |3 G" o0 Z0 C; P) `
- void main()
9 n' Q- V. o, {2 ~+ t - { X. J7 H- S( f( ^. ~- [* R+ q
- WSADATA wsaData;# p- O' j% p! L/ i% z" M% `7 R
- SOCKET sockClient;//客户端Socket* i1 h( k0 F" p" c' K" b
- SOCKADDR_IN addrServer;//服务端地址. c* v" l, E1 |/ _% b: e, { c/ x( g
- WSAStartup(MAKEWORD(2, 2), &wsaData);) ?. F1 h* z z! ?0 v9 w
- char message[20] = "HelloSocket!";1 T3 J: ]+ j& r8 _+ N$ e% C
- //定义要连接的服务端地址
; L, j# F d* b7 W- b: L' Y - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
, {. w+ P- `+ E% w( q - addrServer.sin_family = AF_INET;
& L; o" m# a, d% { - addrServer.sin_port = htons(6000);//连接端口6000. m' R, S* o: q0 n2 D6 N
- //新建客户端socket
3 H- l( v! M N# n: C2 V j8 t - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& U' X! T6 n8 U' K2 Z+ N/ W0 ~
- int s = 0;
. s+ T1 P6 M( g: f3 c: I - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 z( \ R) \% O2 F
- 7 t5 {- w' H8 E Q
- while (1){
8 y3 x+ M( T, f& [& T5 I - //发送数据
& P+ ^1 `6 v+ U - int a = send(sockClient, message, strlen(message) + 1, 0);* |# @1 I, H$ \- s5 [0 _% |
- printf("to server:");; ?1 ?( j+ R* X
- scanf("%s", message);6 e" R$ l3 G4 H8 o
- 5 J9 k% [* V6 ?3 x/ ^1 E
- }) `! a) Q. e, t! z# ?7 `3 L9 o& J5 X5 d
- //关闭socket
+ l' m: y* Q1 H% i4 [. F9 z - closesocket(sockClient);, {1 y0 N4 Q6 M- i- Q
- WSACleanup();6 p( q3 Q+ k; ]2 M% S$ N0 d( T
- }
复制代码 求懂的高手来解答一下。5 ]3 J. a& G, r" M
谢谢了!
; M; Y+ u Q) M2 s% N* c
. A5 v7 A2 V. ~. r, W' L* R5 J( H6 d
' N+ S* ]# @0 ]' _1 K- b4 p5 @
|
|