管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。% C+ W2 R+ [, p4 G+ \3 `$ v& s( `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) v0 {* G, s+ |5 YTalk is cheak , show me the code., f) n8 ?2 \- _' F. G
服务端代码:
& p' T# A& L! M- b- #include<stdlib.h>% }0 x8 I4 W, D) h' C
- #include<WinSock2.h>: c0 s+ M8 {9 b8 Z
- #pragma comment(lib,"ws2_32.lib")0 s$ \& F% O2 a; R
- int main(){
7 y$ S& a% E0 } - WSADATA wsd;
7 |; A7 e% l. K8 X - SOCKET sockServer;
# t9 _& z# C. O: G. y% o* h - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号3 o1 y6 V" D4 h& t( M
- SOCKET sockClient; s, w4 g9 N H/ }/ i H
- SOCKADDR_IN clientaddr;
) h% q! o$ o$ c" l9 Q - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
1 }9 A# i, B1 U8 T/ @ - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket: i* L) g ~ X: z
- 8 _( }7 Z3 b$ p* {
- , S% ^9 ~" e* y( S1 m$ K" c% u+ i! |
- if (sockServer != -1 && sockServer != INVALID_SOCKET){5 m0 ^( X: z* |
- printf("Socket has been created :%d", sockServer);
# _' L8 i) K. l' [/ [ m+ i4 m - }
* _/ `, E2 g+ ^+ b - else{: e5 a1 ], w9 r% V9 r5 H* r) _
- printf("Socket create failed.");; ^4 g/ u5 ^) h' W6 p* g2 l
- exit(0); ?4 n: y" l' b/ g5 C# t2 f7 }
- }, c" i1 [/ o& e* e* K
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);& }5 S2 g& U( p7 Q1 B2 T6 A
- serveraddr.sin_family = AF_INET;
6 J1 J! d6 h0 |7 k- O+ X+ J, ] - serveraddr.sin_port = htons(6000);//绑定端口60002 u% N3 q* g/ c, A A; o! D' a
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));( d4 F3 K" _7 y. d" V Z/ M
- char recvBuf[100];
3 x. \; k" z: D5 C } - int len = sizeof(SOCKADDR);- q( W2 s- Q5 z) A7 u& [; T0 x
- listen(sockServer, 5);//5为等待连接数
; Y6 Y; C- L8 f1 ]2 l - while (1){# u/ k0 S8 _0 w. k# H: m6 C6 \
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
" W+ k; N; \2 ? - //接收客户端数据
) B$ }* D8 [6 h3 M3 v+ R/ }) R+ u - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
' c: ~+ d- u+ t) g$ ]( U0 a9 A/ H - printf("to me:%s\n",recvBuf);. g: S1 `' p h2 i4 u
- memset(recvBuf, 0, 100);5 x/ Y* Q) D; X( c! C: H M
- }
2 K6 S* K+ _4 o/ F - closesocket(sockClient);
% {$ R( d. j8 g" C - system("pause");& C3 \- L9 c2 @( l; c
- return 0;
& \. w5 ?, z: s7 M% w8 R1 d$ h0 v0 m - }
复制代码 客户端代码:
; O, e- H' \& t t0 I- #include<winsock2.h>8 [/ ^3 K! w0 _0 U: D
- #include<stdio.h>9 y& t; ]( k# u [+ m; r
- #pragma comment(lib, "ws2_32.lib")
7 b6 N6 X/ d4 |, Y/ ]6 `7 e8 q - void main(); P& M& I3 o1 U/ z1 K1 c- H% r1 x* O
- {
: v" i# M9 m: T* N, q \) K - WSADATA wsaData;) X1 a' N& g$ ]' r4 \# o t
- SOCKET sockClient;//客户端Socket+ K* c! H9 D/ |8 w2 j
- SOCKADDR_IN addrServer;//服务端地址
* G! W" Y8 A6 A7 I - WSAStartup(MAKEWORD(2, 2), &wsaData);
s" ^- @& L8 T4 g" | - char message[20] = "HelloSocket!";! l$ r0 E' N6 N+ `4 l! e
- //定义要连接的服务端地址# s) g! v0 H1 F# G4 ~9 b l
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)) F& J! l8 S) b$ D1 e% J7 {
- addrServer.sin_family = AF_INET;
; V! r; r5 \9 K; |! f - addrServer.sin_port = htons(6000);//连接端口6000
% n6 U6 U; [8 \" U - //新建客户端socket9 x0 p3 }6 L1 N* f0 h1 e! A
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);! [- T$ @% x5 m: A7 r" }3 Q' B7 T7 B
- int s = 0;, z/ ], A- r6 V. M ~% a
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
0 T& P X) E7 P) }; z3 m z* c) J - 6 E; D+ {- v, k+ l2 E1 j5 O% g) g
- while (1){
6 g, p, _( T2 {- I2 j - //发送数据
7 r+ L& y2 O$ i6 v* n - int a = send(sockClient, message, strlen(message) + 1, 0);
5 u& J$ a5 Z3 f l3 D& T - printf("to server:");/ g% M/ B. h5 i7 g& K! L. W
- scanf("%s", message);3 [# N( _* T) h; M! M
4 V% x5 v4 X- O- }+ V3 _5 ~& i3 d" T+ D
- //关闭socket
' z' z+ o1 H6 J0 W - closesocket(sockClient);! u# Y& t- [6 \# e$ W4 a2 p
- WSACleanup();# j' z0 i# h* A- z% M
- }
复制代码 求懂的高手来解答一下。
5 G9 h! O: O/ V2 B7 _5 X/ |谢谢了!
; W8 J& y: b% F+ z
+ P' B5 h# w+ S: w6 o
9 |0 y: g- z. O4 i0 _5 u' o: }
1 S& {9 b. I) h D! F1 A# g6 H |
|