管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
& n ?$ G& q- F# n$ r我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
. Z w l$ a% |5 y, o7 b8 }! @/ dTalk is cheak , show me the code.
3 h' @: C4 c2 ?% G a服务端代码:
0 o5 ^4 x' a+ V3 b- #include<stdlib.h>0 e& V+ `& P7 b7 q" q$ v
- #include<WinSock2.h>& [( h/ E) V8 f7 O5 g
- #pragma comment(lib,"ws2_32.lib")
6 W/ @* G. G; x8 l3 | - int main(){) q' x+ {, ]6 G: ?5 E
- WSADATA wsd;+ ]! u1 d& N8 \4 j. y; V
- SOCKET sockServer;- D2 c+ F b$ i5 |
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
( e% u9 Q/ E3 I! O' A! b. U - SOCKET sockClient;7 L, j9 [8 U; l, p
- SOCKADDR_IN clientaddr;
; q! I+ g3 \1 P! g - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口9 J% J3 z$ \" F7 f
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
, ^1 K' ?9 q6 d5 p
' Y+ k6 m) Z% u. t- ( K2 h1 V7 V j- A
- if (sockServer != -1 && sockServer != INVALID_SOCKET){9 d# J1 I% D \4 j+ j; O, a
- printf("Socket has been created :%d", sockServer);
+ Q, m# F, k/ c! w. y7 k - }/ z: o7 C: C% E) D1 v' p
- else{
5 y- \/ R, u7 w - printf("Socket create failed.");
+ _( r+ y0 a, F( ^* ^2 g - exit(0);2 h/ B7 T6 F7 |8 _
- }
4 ?/ c+ p) Z3 H/ ?+ ` - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);( E& X% v1 e" {
- serveraddr.sin_family = AF_INET;
/ h% V3 m7 I; |! N - serveraddr.sin_port = htons(6000);//绑定端口6000# i/ Q3 w& p) ]1 F) h7 W
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
& r+ ?- i( G: c) y& ~7 F - char recvBuf[100];3 `/ ]8 O2 v; M* u
- int len = sizeof(SOCKADDR);
2 H* R. X/ r+ V/ \" l - listen(sockServer, 5);//5为等待连接数* R( u7 O2 c# c
- while (1){! _0 h6 `. J c
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);" u9 y1 J& Q4 A& S9 ?. t# r
- //接收客户端数据2 R% }, W9 p( B
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);0 ^& Z/ V9 a! a( s. w% i
- printf("to me:%s\n",recvBuf);' y2 F/ \) H0 x0 i$ ]
- memset(recvBuf, 0, 100);
$ @& S$ N2 M& L2 S8 _# U - }
1 P7 q _/ @& I1 f - closesocket(sockClient);0 d4 N% i9 K3 _0 g+ Y
- system("pause");
) q, ?5 l( Q3 _" c( z - return 0;
9 z4 B, G" h. h4 C8 L; K- H" k - }
复制代码 客户端代码:& e7 o2 T2 y4 C3 o1 o
- #include<winsock2.h>" |- N) v5 Q: w- R* g# k
- #include<stdio.h>) U7 Q' p/ C, b/ R) ?
- #pragma comment(lib, "ws2_32.lib")
6 s% S* V; E0 [2 H' ~5 b5 ? - void main(): H6 t+ g. N5 e5 n
- {8 p. E* O7 s7 D
- WSADATA wsaData;
) D8 b& ], w& b" F& m0 t, T - SOCKET sockClient;//客户端Socket
; @. I! E- f ~; ^- D7 ~3 J - SOCKADDR_IN addrServer;//服务端地址" v. Q3 F. h. I# J2 ]. `
- WSAStartup(MAKEWORD(2, 2), &wsaData);
+ G+ [; N: T) _! {3 R - char message[20] = "HelloSocket!";
; ]1 ?4 L6 }% G, G - //定义要连接的服务端地址
6 L& ~1 c3 L+ g - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)/ b4 |& }7 J" h. f, F" W
- addrServer.sin_family = AF_INET;. S# C% J: P0 d. `+ i! ^
- addrServer.sin_port = htons(6000);//连接端口6000
* M' L( x9 f6 L) Q0 T- G* b - //新建客户端socket
. `9 }& D) Z! i Q0 G+ `/ a - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
2 r# c; C4 r$ b/ O0 S# c* M$ ~ - int s = 0;1 s. ^( x0 a9 p# p
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));" F& f: A& J n, P
( G$ W' F; P6 `& ^- while (1){
/ g: h; _8 T' x - //发送数据/ S2 p8 l: `! H9 x8 l
- int a = send(sockClient, message, strlen(message) + 1, 0);/ u3 p$ |8 n. G
- printf("to server:");, B& [% @0 w- W' q+ Y0 Q2 V
- scanf("%s", message);
+ Z% |; _/ T8 r+ S
! q8 t1 S; |: `0 @1 G- }
& z1 i& y7 d) H7 e - //关闭socket) L4 @3 M4 e/ o" i# L N
- closesocket(sockClient); H# Z: U7 ^. Q' d/ F( J. W
- WSACleanup();
5 b& N% J5 X) v2 X2 Y - }
复制代码 求懂的高手来解答一下。. a5 O" Q3 X9 ^
谢谢了!
; O) N0 _8 [- {. M9 G- g2 I
0 A* E* E2 L" Q# b, p: W& T
3 S4 L" p n7 k+ T+ V. k. v5 b. f5 o1 h: G# y/ |( k
|
|