管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。5 x8 G+ D: ?$ X4 t9 V$ N' U# l. _
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ h5 ? b/ D' M
Talk is cheak , show me the code.
) V: A9 G" L& G. j D( G7 N服务端代码:
( {/ A0 t' [' i) c& \+ `- #include<stdlib.h>
. O4 l& P' n1 _ - #include<WinSock2.h>
0 k: ~$ g" m5 k( [ - #pragma comment(lib,"ws2_32.lib")5 k+ y2 u7 M1 J$ U. r: z+ z
- int main(){
( a6 Y3 e; ?- m - WSADATA wsd;
# C( \. }: V. x) m, N9 h+ U7 ~0 Z, T& G - SOCKET sockServer;
% j. \1 A9 a7 i) T - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号: B8 J& g* {1 w: J B$ v/ t4 n
- SOCKET sockClient;
. v1 b/ u D4 T7 ] - SOCKADDR_IN clientaddr;
. Q& M& F& T4 S! v - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口, `# x5 m% l D7 g
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket! R% j, T" E1 V/ a2 @+ T
- 0 q/ M& \6 g% I' a* c2 |
- 9 c" [0 N3 Z- R! J F# `
- if (sockServer != -1 && sockServer != INVALID_SOCKET){% u6 B' Q2 r2 y) G1 ~
- printf("Socket has been created :%d", sockServer);% {( E; L9 }3 h' j2 v ?
- }
5 ^; `+ s( r" j1 Z - else{- W6 ~, o3 L+ w
- printf("Socket create failed.");
/ q& N9 u, B! f# r) I V5 { - exit(0);6 s( ]6 m( }4 z/ X0 s. Y
- }
; r3 v4 D. g1 \* N X+ H - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
) r4 a: v7 ?5 K6 `* Z4 |! R0 } - serveraddr.sin_family = AF_INET;
; g% {/ p7 o9 }; K - serveraddr.sin_port = htons(6000);//绑定端口6000, C2 m, T& i3 m L. h4 X
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));, ]7 F" c1 B1 Q) e3 ^
- char recvBuf[100];
, ^& [' @+ d. z - int len = sizeof(SOCKADDR);6 Z! ~3 {! d+ O5 {2 j
- listen(sockServer, 5);//5为等待连接数
@ i' F5 Q8 c. n ?) B* u - while (1){' D5 E; i- ], Q+ R
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
& I# z, y1 u3 F) T! k' O) D - //接收客户端数据
* Y' S' N* o0 G% a5 c2 q# j$ k$ T - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
7 G/ E7 S, p/ j4 G0 o2 O2 q2 f9 j" c - printf("to me:%s\n",recvBuf); W. f, \# y+ \; G8 |9 s) v# A
- memset(recvBuf, 0, 100);$ f5 l! ~& V4 F1 _3 u/ l$ V
- }6 O4 b: e7 V s p# \0 W
- closesocket(sockClient);; i' Z* h. v! i
- system("pause");1 O \ L* `$ h
- return 0;3 H D1 B' A' i. A: w! p
- }
复制代码 客户端代码:
. ^3 |/ ]* {8 v- #include<winsock2.h>: S4 J6 q' F% l+ ?
- #include<stdio.h>
( f4 j( M) V: V3 p6 R8 @2 o - #pragma comment(lib, "ws2_32.lib")/ U% s- w. E9 k
- void main()
" A/ I1 z7 J, Z3 r - {' w4 f5 F- ?+ r7 l5 v. y2 z1 s
- WSADATA wsaData;( G+ V3 ^- V3 E0 H6 o# V5 {4 K
- SOCKET sockClient;//客户端Socket# k5 M/ y! Y* ]4 y
- SOCKADDR_IN addrServer;//服务端地址
: l. T6 A8 x, G8 x( J - WSAStartup(MAKEWORD(2, 2), &wsaData);
- a8 T0 ~. t9 E! g! e/ u* | - char message[20] = "HelloSocket!";
- ~9 \( o; `' G. V4 S' y" ~ - //定义要连接的服务端地址
/ O9 A! X# U6 W! s! k - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& b5 @+ U5 s: u
- addrServer.sin_family = AF_INET;
; l! Z$ z( z6 N. P: e - addrServer.sin_port = htons(6000);//连接端口6000
% [4 E2 ^5 n5 h# ~ i% c - //新建客户端socket
$ R$ N# C( C! R - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
# w$ b$ N/ y# V, | - int s = 0;$ N0 U) J/ v& H& A% S# I8 r, ~
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
* R* m9 G9 o% V( M6 w4 Q/ |: z - $ g' i J7 ], N, [ H) k# L
- while (1){
0 L4 y2 ?4 H! o, g - //发送数据0 R- u) C) i) Y# l
- int a = send(sockClient, message, strlen(message) + 1, 0);
0 {1 m) R) A" k$ U5 _' I+ E - printf("to server:");
+ _) _5 @9 u! Q8 i7 g - scanf("%s", message);9 \. Y: P3 G. K9 ?" c* A8 G
- " K# s5 z4 J) K
- }" w' T: l4 H- g& o
- //关闭socket! W/ A3 d l/ Y- w* u' z! A8 u7 K
- closesocket(sockClient);0 W6 d# h3 X- B1 `% Q
- WSACleanup();% {- p1 H3 f! q! R2 K
- }
复制代码 求懂的高手来解答一下。
4 a8 r# B1 G% k谢谢了!6 `+ l: K9 c7 W* N* H7 O
- z' a; J7 P3 @9 ~: c
* f3 q7 j5 H9 P; _- @8 @) B9 |
0 z4 q" @% y8 D& ` |
|