管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
3 p+ n2 j z: q7 F" r5 q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ c) Y: R# s) w' r: u2 p, C( E
Talk is cheak , show me the code.( n' x5 A; m2 Q) m& k
服务端代码:$ |! j5 o& H3 P
- #include<stdlib.h>0 u0 B" P: a" e0 @
- #include<WinSock2.h>
9 d) ~# ]5 B2 e% E* H' K - #pragma comment(lib,"ws2_32.lib")
( L# Z( Y: z1 t t% n3 }5 j& q - int main(){
' S2 H, D$ h+ n - WSADATA wsd;* f4 }+ R1 `+ F6 ~' F( y8 D# N7 \
- SOCKET sockServer;
4 D% ?' w2 p2 D3 } - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
$ k* l- M! ]& y0 Z1 y9 P - SOCKET sockClient;% {4 @( u% h1 [$ ] }
- SOCKADDR_IN clientaddr;; p9 x5 T* K$ L3 a( u
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
9 u0 h6 _4 \+ }$ l1 Y5 K) o$ z - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket _4 p/ K# A1 r, R6 h7 Q
- # {% u! d' o4 y3 s& w
- * K8 z9 M+ d# D6 @: p K
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
( {3 [& ?/ w/ O( k7 F - printf("Socket has been created :%d", sockServer);, ]" k W. N+ ~7 O- I) N0 H2 P
- }1 Q9 L* ~) W2 Q2 A
- else{: T9 { j9 z( G1 q- v
- printf("Socket create failed.");. _- m- @+ ~: t. i, C& z( S
- exit(0);
" F. h9 Q/ F' z+ e6 G0 F - }' n; d2 a: @; r, Y+ Y c
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
, @* J+ n/ l2 G5 I: A - serveraddr.sin_family = AF_INET;! z$ w6 n! \( {5 g+ e
- serveraddr.sin_port = htons(6000);//绑定端口6000' M& m- Z; {, [: h# n, \
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
3 ~$ H' n* ? i' N - char recvBuf[100];* @% u; m: N7 e* q+ r' C( I
- int len = sizeof(SOCKADDR);4 W, A3 b- ?. U+ A5 \
- listen(sockServer, 5);//5为等待连接数$ S0 ` N; P' v4 Z- ]
- while (1){8 @" a6 m& T% r4 |
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);- a3 v' E6 H" W: L. W, I' d( R
- //接收客户端数据/ N& k. J; U0 l2 n9 f
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
: j) B( _6 F: F* o5 @) x - printf("to me:%s\n",recvBuf);
* L2 s- I, ?" F7 w: g) y$ t - memset(recvBuf, 0, 100);
' s& z5 b* _* P* R- Q - }: p) p6 _4 J Y
- closesocket(sockClient);
" h) y+ w" r, X9 T8 L- s* v - system("pause");" C1 c6 h4 b0 ?8 @5 L$ b
- return 0;
* b& s3 F1 H& B. \ - }
复制代码 客户端代码:
$ c6 h4 d' b9 M' F0 G) `- #include<winsock2.h>1 P1 {4 s# A' k
- #include<stdio.h>
% {& l+ J* }2 `5 N - #pragma comment(lib, "ws2_32.lib") l! S* r) _$ p; m- w. S' n
- void main()% b3 _. E/ F1 d! _0 l; C. j
- {
5 }: `/ g" Z& w) y" L7 L - WSADATA wsaData;
+ n7 p9 @4 t u' [ - SOCKET sockClient;//客户端Socket1 o: Y0 u2 w6 v; f* [3 d( U0 P d
- SOCKADDR_IN addrServer;//服务端地址/ w9 u M' D( G0 n3 [$ s
- WSAStartup(MAKEWORD(2, 2), &wsaData);
( w) G- G# K/ D' R - char message[20] = "HelloSocket!";
- @6 i8 P1 a/ p3 u. S - //定义要连接的服务端地址- L2 @3 m1 X6 h, c, Q
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)6 }& g/ r% N- F" l4 B
- addrServer.sin_family = AF_INET;
2 p: _+ g, c3 R) b( L9 o - addrServer.sin_port = htons(6000);//连接端口6000
1 G( P# m" W; n: n4 K - //新建客户端socket
- c* N/ w8 ^2 ~7 ?5 A/ b - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);2 d: X$ o5 a! i# x. |1 L
- int s = 0;
- f; K$ p% D4 Q+ L - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));4 {' H6 g: \" R/ r- ^9 y
. d* a9 I; D7 V2 r- while (1){
5 Q: r. u$ L/ `0 [2 [! y - //发送数据. p) {: ]. k5 J- P+ `/ N
- int a = send(sockClient, message, strlen(message) + 1, 0);
% I$ V, r6 Z: a - printf("to server:");2 P6 S8 [! }- B1 G* c x, B; F4 S
- scanf("%s", message);7 E1 S7 B8 @0 n5 P$ I
- 7 v; p# x; n7 `
- }
! ~- r# C5 y( n; [% q0 Z6 L/ p - //关闭socket. C5 l0 ~3 T7 @3 K% z$ F
- closesocket(sockClient);
) w2 ]6 x, e/ ]$ r( J - WSACleanup();
" }& W, C& a4 u3 t: s7 C/ e2 @ - }
复制代码 求懂的高手来解答一下。
% M5 ^6 V$ J: u' ?, @' L9 J谢谢了!: E3 h- Q4 `$ G' T7 J; i
" Y0 R# @ n7 k) h& a( m0 _1 z9 k: @* x& }/ C3 z1 w
4 p1 M7 }( F* k( e
|
|