管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。: \( b2 ]- R! z. J& t
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 ~4 h8 B$ L; YTalk is cheak , show me the code.
6 F. @* u7 s. ` W& f* Y服务端代码:3 d& s& P3 J: d) _
- #include<stdlib.h>0 s1 @0 d+ [. L) u1 o
- #include<WinSock2.h>
! a+ C' @4 q, ~* ^! ^0 w/ M/ B - #pragma comment(lib,"ws2_32.lib")
, W5 q/ A+ ^8 G' O1 j: W" O/ R - int main(){* Y# G1 [8 _% ]. J
- WSADATA wsd;
7 G+ p2 X X+ k) C+ F5 l& Z# G - SOCKET sockServer;
+ J: v( N, N. q - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
+ B/ X+ X( ^! ^* |6 g - SOCKET sockClient;
( G/ O& {) b& B! c - SOCKADDR_IN clientaddr;
9 F) p" h0 C+ C& U; a6 L - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
) e% Q3 v& E$ g, c! e4 ] - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" e" O1 Y# p6 T3 ^5 @
7 \' s! ^: _9 W) H/ K" u2 Y7 a- 5 z+ E/ l, Y7 N" B( V! l
- if (sockServer != -1 && sockServer != INVALID_SOCKET){, F7 Z* s+ `3 U- w/ _$ c$ W. N
- printf("Socket has been created :%d", sockServer);
1 Q* T2 v* ^. T" Y, O$ H - }
6 j/ X$ b5 Y2 v5 j: `: W1 P: _! l* X - else{$ K+ f6 K- l' C/ V% a0 g
- printf("Socket create failed.");! ^) z9 @. F; z# [* X# _
- exit(0);+ l' o, i" ~. N6 ]/ ~' E) t
- }
9 P. W0 C+ M! C3 i - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
0 P7 ?. D- y5 U3 p - serveraddr.sin_family = AF_INET;4 Y) C7 F* Y0 [! b
- serveraddr.sin_port = htons(6000);//绑定端口6000+ A& c: r9 r* [+ |
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 r% w6 f. W0 O: a8 o2 V
- char recvBuf[100];3 S/ R4 N7 n8 u0 Q8 g
- int len = sizeof(SOCKADDR);
& H1 U; a8 n. r" w - listen(sockServer, 5);//5为等待连接数1 j! y# W+ t( j1 {+ I0 p, \* J0 Q
- while (1){6 O- X) z& w$ ]3 Q5 G' r
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);! o" ~/ p+ F+ c
- //接收客户端数据2 `3 s- I. U. v
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);' v1 z6 T5 m! L
- printf("to me:%s\n",recvBuf);/ E# B/ _; m% m" `+ w6 i3 [: N- a0 e
- memset(recvBuf, 0, 100);, \. q O; c- \7 o: b. v$ Z4 J M
- }
- ?! z8 A1 X4 J8 _# @+ P+ f - closesocket(sockClient);8 u1 l+ y8 T3 y. R4 I8 p
- system("pause");
& I8 X. C+ m5 z( K8 J) j - return 0;8 I* v8 c0 O; F6 S
- }
复制代码 客户端代码:
% {7 m) v- P4 s0 `: N. E' v1 s+ h- #include<winsock2.h>. a+ L5 {; V* E3 H! x7 o- ]
- #include<stdio.h>
# x- u$ W4 K7 x) G" v' \ \# C- B - #pragma comment(lib, "ws2_32.lib") X B( M4 O! ~( }9 @+ G8 H
- void main(): v8 l, V" V5 q. G" q
- {
! d* G! j/ L4 ]. l - WSADATA wsaData;
. f+ C8 f% e$ ^: l - SOCKET sockClient;//客户端Socket" t E9 g0 M+ |' y% I
- SOCKADDR_IN addrServer;//服务端地址
& b& K5 V, T: ^' w3 O - WSAStartup(MAKEWORD(2, 2), &wsaData);0 X7 p: C/ R7 X1 X: R
- char message[20] = "HelloSocket!";
3 R0 P" |" r* w% \1 \$ Z$ H - //定义要连接的服务端地址
4 [% w3 y* a* `, Z+ T9 v - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
' A+ N# |7 S+ F; ]) M% E# q - addrServer.sin_family = AF_INET;" V3 F5 N9 G) _- a0 g- [
- addrServer.sin_port = htons(6000);//连接端口6000
) C/ e, j5 W: ^ - //新建客户端socket
2 b1 U% d% E! f6 G X4 W. j7 M, f - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& V1 j: `/ ^ E! R2 s
- int s = 0;
9 `: ~* m+ q# B - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));5 J) [# e) c: {, q
* }2 K( C6 S9 _3 q1 u& @; W2 j- while (1){
" b Y& l! P% p4 o1 L5 G& F! ~ - //发送数据
$ o& n6 I9 L$ ]2 W0 A - int a = send(sockClient, message, strlen(message) + 1, 0);/ X/ P8 e- U( T; A8 e6 m) [& R
- printf("to server:");
9 a! p/ D" `, i$ Z" h - scanf("%s", message);$ P r8 O u* \' O0 b( @
, a+ j* E3 k1 J0 ^% d7 L- }6 P4 F8 `3 Y/ s* p. U. H
- //关闭socket! k# p7 K; n4 ?8 `6 Q
- closesocket(sockClient);
; r% z$ H: c' A; \ - WSACleanup();& _% i6 S4 `7 }6 e% P
- }
复制代码 求懂的高手来解答一下。
- J# z8 J* M! N2 Z: g* T谢谢了!
6 z6 O5 o) V9 v" ^1 R4 e0 f8 m( _% \1 v8 t+ X# g. z p- y! x. r/ q
2 ^! w9 o* T9 V9 ^% \
, M$ D+ H+ _6 r( ]
|
|