管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
5 G9 j3 M0 R U1 t我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。- K1 q: c. r) f6 n6 c& h; u
Talk is cheak , show me the code.
* D; c! U/ a" ]' W; }服务端代码:; S; X) [4 E% m) h+ `$ b+ `
- #include<stdlib.h>
: d4 ~5 g3 A5 G I. | - #include<WinSock2.h>
! u6 @$ F% ^" E% X+ w* z - #pragma comment(lib,"ws2_32.lib")
1 d! ^( a" r a5 E# g1 \) a - int main(){5 m% F5 ?" j7 C7 I' G
- WSADATA wsd;
4 A/ ~" [ e/ `# I- U5 V - SOCKET sockServer;( E' `$ s# c( y' C
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
+ Z* V8 [: Z) J6 q/ x3 l - SOCKET sockClient;5 K( R2 f1 C' J& r
- SOCKADDR_IN clientaddr;
3 t, I+ |9 \9 K# U6 S4 l9 b - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
5 e3 o- y3 ~) i" r - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
) T" a+ R* q" T3 h2 c* k3 j2 J, b5 s
8 x7 P$ Y2 @/ C+ E: a- 3 Z/ o( M. t) {7 m
- if (sockServer != -1 && sockServer != INVALID_SOCKET){# R8 D6 _, A+ L. i
- printf("Socket has been created :%d", sockServer);6 r; U5 Q* g; c) g }9 T
- }
! l" Y4 d5 k# ~# Y# g. _4 A# S: \ - else{
/ {" X, ~0 Q. Z0 ~ - printf("Socket create failed.");
# _6 @1 u4 J6 O- A" E0 |5 X4 ~. \ - exit(0);
6 z7 }7 W0 z1 h8 w8 S - }
* Z# w1 j6 j, Y' x- c) h) g - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
. S3 g$ i4 D- n# n |" m: t/ q5 f( j+ i) Z - serveraddr.sin_family = AF_INET;
7 A5 O! ` ^6 a( p - serveraddr.sin_port = htons(6000);//绑定端口6000# O7 q/ S( Z: }- i
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
$ `$ M) J+ o; ]5 g2 M' a9 I - char recvBuf[100];
2 g/ Y2 r' W! R/ n; g. M! ~ - int len = sizeof(SOCKADDR);. j+ |( f- f2 \/ f" g
- listen(sockServer, 5);//5为等待连接数
0 Z9 h4 N& M( n, ?* W. D - while (1){
3 y( [' ? C- H - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);9 n1 }- a7 Y# m
- //接收客户端数据
2 @- A! D. o( s/ s2 z- u0 _ - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
4 e* t& `: R& u - printf("to me:%s\n",recvBuf);
8 ]+ @0 r1 S. z2 {2 A" e7 N9 H - memset(recvBuf, 0, 100);5 A% B; _4 g1 p( h! W
- }
1 S2 N6 b, P0 E4 f. U5 }6 T - closesocket(sockClient);
+ h2 R: v& b/ u( C. L - system("pause");
# Z9 h C" G7 z( T$ t4 f - return 0; G0 Z: Y& U4 z% S' r
- }
复制代码 客户端代码:
8 ]0 }$ `9 m0 k% U3 [+ x- #include<winsock2.h>
( y" U. B( T8 e1 R ^8 P - #include<stdio.h>
2 p* h! q3 G, {2 n - #pragma comment(lib, "ws2_32.lib")
( N/ g# K$ R. `+ R0 h- | - void main()
+ O7 p! E* w* l7 k% f+ @+ i - {+ E9 n o& m& p5 V; a
- WSADATA wsaData;
1 E7 X6 v5 q% _5 B - SOCKET sockClient;//客户端Socket" y9 T: u7 s1 z9 ^* m) k
- SOCKADDR_IN addrServer;//服务端地址2 k: s2 s, ^7 V3 m
- WSAStartup(MAKEWORD(2, 2), &wsaData);, p n+ A# A- y/ y: N7 R0 |' w
- char message[20] = "HelloSocket!";8 m* M# _! F6 r% ~ t$ G- ]
- //定义要连接的服务端地址
! {) }2 e% g% l) Y - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# o) l* `4 W6 m6 a- I C
- addrServer.sin_family = AF_INET;
8 B, _3 x3 P5 M7 r1 q2 y, X Y - addrServer.sin_port = htons(6000);//连接端口6000( E2 R2 ?& J8 c
- //新建客户端socket
. S" i6 u$ G. K" `9 @" G- z8 `: I8 p - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* h* }6 C- i( o' T( ^
- int s = 0;
% P* g! r4 f) N7 W' V6 z. s% a$ h - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 C# {; y- }% o t
- 7 g m F# K; ~9 z' |$ H8 _8 P" O
- while (1){. s h0 f; D& c I( o% e
- //发送数据8 c; S7 ]2 S0 R
- int a = send(sockClient, message, strlen(message) + 1, 0);
5 |8 O* E; U7 E - printf("to server:");
# |- p8 V B5 [$ E; p. d - scanf("%s", message);
8 O( d5 k& K: o4 x7 o; A - / s/ }$ E% W/ ]5 h( N! I
- }2 v: M( c* K- ]% @% C7 `
- //关闭socket
0 @) a6 O! w" @: Y$ _6 h" C3 z - closesocket(sockClient);8 G. W4 l( e/ ~0 } V
- WSACleanup();/ a% V( k$ [4 d, \
- }
复制代码 求懂的高手来解答一下。$ M: |) a- A% n ^6 Q4 W& t% Y
谢谢了!( a6 C6 }8 b& S& C2 _0 s* u
8 E' k7 H6 S8 J2 ?. _5 q8 H- @( @) |! D7 w* R
$ X; s- f! L! B8 y4 w- J3 R |
|