管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
- i3 O, H3 A" A& Q" Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, U; A9 Z8 d# J! Y
Talk is cheak , show me the code.
$ P( Q" `- e( _. B8 m3 g服务端代码:
+ W) b- w* ]4 b0 B: Y1 S3 W$ x- #include<stdlib.h>
: b( M' e6 v3 e% e l - #include<WinSock2.h>1 I& [) M' l- W4 a5 c; E2 [7 S
- #pragma comment(lib,"ws2_32.lib"): X: G# o2 S) `6 @/ `* p. ~
- int main(){
9 B a. x- q2 V$ @/ X - WSADATA wsd;) K$ y) j. ^7 |5 Z3 q
- SOCKET sockServer;
' {& s/ F# U) M* f" J$ q - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
0 U" a5 E) i8 _( Q M - SOCKET sockClient;8 G% ^/ s5 [; `' X
- SOCKADDR_IN clientaddr;
+ I l) j) g* y$ A; U6 y' Q2 d& d3 S - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ j$ e1 C2 |- Z% J, s% b; v1 T
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket$ d2 P8 W0 f) ?) N: H% K* C3 [1 H
/ `, M& G {3 e8 M! @ J' U O' X
" u; b; f, W3 i" t- if (sockServer != -1 && sockServer != INVALID_SOCKET){
* M/ |1 }: a& |6 Q! \+ z8 N& O - printf("Socket has been created :%d", sockServer);
0 b5 E9 L8 |* e& o% ]+ f- ? - }
* v% l1 p, [$ V s& B0 g - else{- B d Y# f1 O: g
- printf("Socket create failed.");7 }' [7 H6 M1 ]9 {- ~) m; K$ ~
- exit(0);, g5 V# r/ K) v% N' Z; f
- }& Q7 L' R) D/ K+ p( W) Z# h4 F
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
/ R, u2 c; c$ _% E# I5 P - serveraddr.sin_family = AF_INET;
: R0 w$ h% g% a$ ?3 @ - serveraddr.sin_port = htons(6000);//绑定端口6000
1 P7 ^6 u" U5 Y R% N8 h9 ~ - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));6 A) p" S) \' x/ Z# W' s
- char recvBuf[100];; D4 c8 a) L1 f4 }% Z) x
- int len = sizeof(SOCKADDR);# O: w J$ c0 I
- listen(sockServer, 5);//5为等待连接数: ?# N5 @% B. \3 F3 `
- while (1){( {9 m% W# L. `0 O
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
& B9 B. h7 G4 J6 x - //接收客户端数据
! `) {1 J( I$ p) @& z - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
# g/ X- l1 f3 |: V( w: v) O3 Q - printf("to me:%s\n",recvBuf);& ]* ]7 `* B1 g+ |; J9 u7 t
- memset(recvBuf, 0, 100);8 N% y- Y2 r& @) x& P2 L
- }# M Z( x z: w0 g
- closesocket(sockClient);
- @, b5 S. i! Q) n1 D$ E# R - system("pause");
0 Q6 v/ B2 @7 T" r - return 0;" s! w, a6 E3 U7 f! U7 k
- }
复制代码 客户端代码:6 F4 p! b+ m4 x
- #include<winsock2.h>
. Z4 Z7 s& O9 }* v/ _2 m - #include<stdio.h>
' {& L- Z+ \' p' A3 r& W - #pragma comment(lib, "ws2_32.lib")
7 i- N9 j7 q: Q6 Y# I - void main()
8 K9 `4 Y, b) F$ S& L - {) k+ b6 J' ~$ a% m) D
- WSADATA wsaData;: w7 e1 {) M& z- [9 Q
- SOCKET sockClient;//客户端Socket
9 i& b3 o* ]$ {% M; p - SOCKADDR_IN addrServer;//服务端地址: y$ S9 k) y9 `# ]% I2 {2 m0 u! p
- WSAStartup(MAKEWORD(2, 2), &wsaData);7 E6 _- O/ E7 ~; X( J$ c
- char message[20] = "HelloSocket!";
& g% C" ~$ j/ c - //定义要连接的服务端地址/ H2 ^% K* M% D f8 U
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)8 x3 G; n( v) r2 q) Q+ a! o& T3 g
- addrServer.sin_family = AF_INET;
9 p" B; ]/ J. l. U& r8 y - addrServer.sin_port = htons(6000);//连接端口6000
# n8 s! j' [4 y& i3 j8 `9 h - //新建客户端socket
. p- b- M& z0 t5 u7 G% r# y - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);5 P/ E1 f, t: M
- int s = 0;
) E2 i1 g# |7 k' y; t/ a8 g - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 l, ?+ S# R) p" j
- 5 ^; e9 ]: W, ^* G$ ]; Y
- while (1){& P1 a4 F2 g3 b( W: S& r# L) X
- //发送数据
0 [8 ~" h) n# s7 ?0 j - int a = send(sockClient, message, strlen(message) + 1, 0);8 ?* q! G8 n$ Z$ ~5 d
- printf("to server:");. Z9 a4 Z$ W( w& ~% u1 y) U
- scanf("%s", message);% ?, ]; |9 Y; f% r
- ]9 X( k: b; {
- }
: ]/ C- o( D8 l: ]& v3 e - //关闭socket
- N: G% W. |. O: L: _ - closesocket(sockClient);7 T$ `; }* q, V& T' J
- WSACleanup();5 W' k7 Y4 _1 @* T
- }
复制代码 求懂的高手来解答一下。4 t% _1 s: o6 y% I* ~( M ]
谢谢了!2 {9 S" O7 \5 N
- X0 `6 @$ _2 q* E% `' M9 @, Z0 s% p
) G* M1 X& S" G% `2 m% \7 T! |1 {
|
|