管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
3 S& \$ g0 K; n8 p! v; J- F我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ ^# R5 _. p% Z6 q6 hTalk is cheak , show me the code.1 ?3 g1 c3 A2 H: D9 ^
服务端代码:
3 A0 S- w1 j& V- #include<stdlib.h>
+ h# N M0 x" e( Z- s - #include<WinSock2.h>
: u x2 J( S/ }) j - #pragma comment(lib,"ws2_32.lib")
/ M- \/ k* |+ y: J. I - int main(){ Z. O4 O+ O f* i7 h4 l9 j5 Q
- WSADATA wsd;
# b' _- g! H) k0 K- ^/ b2 i* K7 q - SOCKET sockServer;
' E5 L; b- z" C - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号$ j' t& o9 w/ |' t" p4 j% M, m
- SOCKET sockClient;9 r/ U0 O5 m6 ~+ Y9 W. ` ?
- SOCKADDR_IN clientaddr;
2 v2 G8 f. G! D1 X( m$ G; t - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
# C! y. L4 x( d; E - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket2 b) ~# w# ~$ G2 [1 G. u
3 b* U& }: W) V9 z- 0 A1 H$ L+ R; i, y/ R2 \$ L
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
: o P6 c; L# x3 J- R - printf("Socket has been created :%d", sockServer);
) s( o/ H, I& F9 o, B6 ~' F - }0 o# a( B6 ]5 H
- else{$ O, Z. f N$ E& }7 S- y
- printf("Socket create failed.");
- n. `/ _# ^3 i0 X - exit(0);) {# i. t4 }! S) m5 Q* W2 V+ F
- }
# s2 t, f. G& G7 C, S4 j4 G. v3 F3 [4 \ - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);/ t1 U! `/ B1 [, }
- serveraddr.sin_family = AF_INET;0 V+ P# X$ Q3 u% Q8 E( t, g
- serveraddr.sin_port = htons(6000);//绑定端口6000- J1 Y# j. A5 i4 Y4 r; g9 i
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
+ r: R: |- H8 T; j* Y - char recvBuf[100];
0 q" m+ d" E3 s/ y - int len = sizeof(SOCKADDR);) H8 C3 E$ A. M( y/ \) i @
- listen(sockServer, 5);//5为等待连接数% { `# \8 q+ Z* O
- while (1){
; i# t+ _) u% D - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
; l: Q! `5 l8 \5 c" W3 U# [3 ] - //接收客户端数据/ t8 B9 i" {8 c. O+ k6 K. ?* o: y
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
) C% a. ~7 D2 s& Y7 ?- D2 Y - printf("to me:%s\n",recvBuf); V( `% r4 m4 J
- memset(recvBuf, 0, 100);0 F3 S; w! f' o5 c: ~: M% q' \
- }
/ S) T. Q i9 Q/ `" V) ?4 m4 L) v - closesocket(sockClient);& y+ d4 }1 ]4 M6 e2 y5 ~
- system("pause");' I/ `' ~/ B7 J# w6 s
- return 0;) d( C6 z, X& J4 N7 E- h3 R
- }
复制代码 客户端代码:% p$ Q& u, |8 G8 M( E
- #include<winsock2.h>6 O) k* s" D) A& Y
- #include<stdio.h># Q8 g0 g1 u: O
- #pragma comment(lib, "ws2_32.lib")
( p$ y. S* `7 G7 H$ W) V - void main()7 g$ `6 ~6 O4 \" G
- {
9 v4 S6 @* g: |0 a" c( p/ G - WSADATA wsaData;9 `' H, Q. x8 m/ i+ F
- SOCKET sockClient;//客户端Socket
1 }* }; Y7 c0 `: L. }$ ~) _ - SOCKADDR_IN addrServer;//服务端地址/ @2 J: s5 |1 V7 \3 @2 v+ F
- WSAStartup(MAKEWORD(2, 2), &wsaData);
8 v' W7 Z+ e C9 `6 F - char message[20] = "HelloSocket!";
) S+ v5 n3 \/ u ], H* g' [6 k - //定义要连接的服务端地址
6 v( o2 _2 I; `5 |, K* L - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); v2 k/ e! c' z/ ]
- addrServer.sin_family = AF_INET;
0 O3 |1 v0 B& U - addrServer.sin_port = htons(6000);//连接端口6000
2 J% W; e1 a1 V) ~ - //新建客户端socket
. \4 ^3 J+ M( r5 ` - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; k! |2 k& y1 A0 k( B9 I
- int s = 0;
6 {, X6 s" f! v% w& ] - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
* x' n) N7 k2 p. s) Q# T- C - 0 W* y) Y2 k& E. w2 X' Z- s; u7 [
- while (1){6 o, f9 c6 [1 F7 J' S# i. e
- //发送数据% r9 x7 z6 p, C5 z. w
- int a = send(sockClient, message, strlen(message) + 1, 0);/ a5 T" M; @1 v0 F; ~# q
- printf("to server:");
8 q$ u B* o; q) G3 s2 U0 D* ` - scanf("%s", message);
# \6 D6 J5 z R2 V5 K" s - ( J" m; I6 S) N8 V& N
- }
6 y o" d$ T$ ?, E - //关闭socket
; {8 Z/ C7 P. K+ v; H7 J - closesocket(sockClient); E r+ z# ~+ X [2 z& u% V7 \
- WSACleanup();; i: Q0 u: \, g) c5 J; q
- }
复制代码 求懂的高手来解答一下。. \ k2 O3 }4 s! ?* s. l
谢谢了!+ a. X9 m7 v8 {* \) D8 L6 |& {
0 O: T3 @* d: }( j
0 ?& A6 Y( v. } r
# _/ P' h2 p% @3 r# M, d |
|