管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
4 {6 N8 a2 H, c7 S5 t/ @6 C: R我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& Q; G$ Y; i! Z5 L; E" Q6 S' L
Talk is cheak , show me the code.
C! e% |' {! ~' [0 y. j5 M服务端代码:
* R6 ]! Q* y0 S7 R. Z8 ^- #include<stdlib.h>7 q6 Q( }' n& v2 t- }
- #include<WinSock2.h>$ j7 t, k# D. @$ h* O {' j
- #pragma comment(lib,"ws2_32.lib")
) I" n1 v6 S: m1 @0 R9 o0 H - int main(){
, A/ O- ~% d6 s/ Q, d - WSADATA wsd;0 U8 |2 Y3 X( ~: m& W* y$ x( Q
- SOCKET sockServer;8 W) u7 H) L. P: ~4 w2 r6 ]. B
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号2 j8 H. l" d8 E
- SOCKET sockClient;, k, f }7 h& d
- SOCKADDR_IN clientaddr;
" k2 j' M+ N" f. B - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口' p. Z* ^' a+ { s% A" ?5 R
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
$ ~; c1 }" G: S2 b i5 f1 q - o; v; A& A; p. W% P
- + Q c. `; l* e
- if (sockServer != -1 && sockServer != INVALID_SOCKET){9 U6 T1 r, W8 d+ X: K
- printf("Socket has been created :%d", sockServer);/ z8 @% r3 F- E! |
- }
% {" G2 E" V9 i6 \ - else{: B! f8 W: ^, I" Z
- printf("Socket create failed.");) Z/ _; t { h
- exit(0);# P/ h5 E* C3 Y+ ^- k% q! i; [
- }
! M4 {4 E# G& m9 h% Q - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);# `7 O: u8 Z# X* G# ]- n, Z) j) E
- serveraddr.sin_family = AF_INET;
4 ?, f! b& r5 `$ ~/ N - serveraddr.sin_port = htons(6000);//绑定端口6000
4 X9 K# w7 ~$ P+ X# y - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& ?6 f) h y- z2 i+ U# I
- char recvBuf[100];* D* a* M% L, \/ B/ h9 D0 r l
- int len = sizeof(SOCKADDR);6 Q' [! U7 G) c9 Y
- listen(sockServer, 5);//5为等待连接数- k2 y- ^: C4 P1 r9 y: a: ]
- while (1){4 b% [3 n% z8 n
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
' O0 k. t) Z& s; y! Q - //接收客户端数据
2 u0 J& n w" D$ t% i7 |3 I - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 G3 v* Q8 K# _7 _" K( P0 p
- printf("to me:%s\n",recvBuf);3 q& Q5 B, N/ N3 ~; p/ q' J
- memset(recvBuf, 0, 100);
7 R, C; H" c8 H$ H" e+ k( M+ v - }
; Q9 G% F8 q( s8 h6 C - closesocket(sockClient);2 R! [% N; z( ]
- system("pause");' N! p6 F, Y, v7 H' B Q5 f
- return 0;/ \2 W% ^# P4 J- m/ B" a k/ N
- }
复制代码 客户端代码:, N1 p. F& z% [* P: b# H, S" M
- #include<winsock2.h>2 W# \+ h: ]) `4 x7 p4 ]
- #include<stdio.h>
8 v/ D! O- s& E& H0 E( V& j$ r - #pragma comment(lib, "ws2_32.lib")
& R: @. n q$ y* D. H/ @ - void main()4 U6 B) V& X |: \
- {
' ~ W8 Q$ w% T/ i, h: L, H - WSADATA wsaData;
# ^4 Z( y! \# v2 E3 ~! X9 |& h - SOCKET sockClient;//客户端Socket/ E7 N' D- f; C5 O* B: H, `
- SOCKADDR_IN addrServer;//服务端地址
% b6 g, |. l. ]' X7 ?* D. U0 j' D - WSAStartup(MAKEWORD(2, 2), &wsaData);) f: F- z- d, q
- char message[20] = "HelloSocket!";7 V6 I8 @; f! H* M" \9 N! T
- //定义要连接的服务端地址
4 p9 O* ^4 i, i9 n - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)1 ^/ W3 q" t; j9 M
- addrServer.sin_family = AF_INET;/ L r3 K( k. Z; X9 I; H% P- h
- addrServer.sin_port = htons(6000);//连接端口6000
. U. t8 C, U* {5 ]. S& G8 o. H( w - //新建客户端socket8 n! P) Q, Y: P1 O3 C( x0 i
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 _, r/ y% [9 m8 c! m/ P2 l
- int s = 0;
2 f5 L6 @) b! z" X g4 X+ A1 o - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));! L- O$ m% p* F. |- H& \1 w$ Z: ` T
7 O$ q" B3 u7 _7 t0 X( ]% l- while (1){. f: b1 } x3 h0 U
- //发送数据 @% `) j2 W7 A r5 Y
- int a = send(sockClient, message, strlen(message) + 1, 0);) O* N' Q+ X2 ?; f
- printf("to server:");9 g- l4 z: ^5 G0 Q* v$ v/ n
- scanf("%s", message);
4 d1 ?. S; h4 s" j; c8 H* D8 g7 M
k" c, m5 n# I- k3 U J2 `7 T0 k- }
' \+ b2 e; h) O8 ~$ d) V - //关闭socket
: t+ q' [8 y$ V7 l - closesocket(sockClient);; |/ H- X5 u- S: @; g! j
- WSACleanup();
4 H7 t" H' a5 V: w2 y9 f7 q7 h$ S - }
复制代码 求懂的高手来解答一下。
% z: }! {+ m) _& V( b谢谢了!4 b; c) Z: ~) t+ ~
m2 x6 A4 s3 L8 @; X' w7 y' D9 V: t4 ^$ k
. x% n( p9 _' p9 C$ k/ @ |
|