管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
- W. v _2 Y9 w8 |2 Y, G我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 k! {; e. f% d( u$ T$ h, ~Talk is cheak , show me the code.
- C, N7 l* {+ ^( \6 ]6 Q服务端代码:( @ P! ?8 Z& r1 ?2 J
- #include<stdlib.h>" \# Z8 z" V( W
- #include<WinSock2.h> q' `/ G6 d* |2 E; o" s; q
- #pragma comment(lib,"ws2_32.lib")# w( E, B! U' h
- int main(){" n7 {7 g9 N( @ K3 a' D* V
- WSADATA wsd;& U( i$ F! ~4 y' d" ]' i" a% u
- SOCKET sockServer;# l0 U$ L3 s6 E/ _/ e* [0 q
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
3 G8 w) E1 ^3 L& ^& A! j& H5 ` - SOCKET sockClient; M( L1 X1 X8 Z; L9 |6 {
- SOCKADDR_IN clientaddr;7 ?3 Q. J# X* l- B
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 t6 i) v5 T! \ - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 Y% x @/ J6 j, g
- & e. L4 F! w5 s# Y! O& ?
, d8 V, v8 n5 M; M- if (sockServer != -1 && sockServer != INVALID_SOCKET){
3 D, ]2 @+ C& E9 G$ [ - printf("Socket has been created :%d", sockServer);( s/ @ c* b4 l' T! k
- }
" C8 W# B: u+ `3 r5 i - else{4 X- L# y* A) A( }! B9 r. z% e
- printf("Socket create failed.");+ X% ^: J. D! I4 R- g
- exit(0);
0 [" q0 `, [/ b1 Y! k- h& g - }
7 l0 [! X' Y6 n4 W - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
+ c+ F- N+ X: P - serveraddr.sin_family = AF_INET;
Z1 o7 n z# J - serveraddr.sin_port = htons(6000);//绑定端口6000
+ ]) _1 I i+ O8 ^& {9 M( e) y - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));( H& ]" S8 e9 w2 J: E
- char recvBuf[100];0 U5 w( i7 [) h& Z
- int len = sizeof(SOCKADDR);7 J' b4 O# w' W) Z' S( b
- listen(sockServer, 5);//5为等待连接数
* U. u/ d0 ~4 w# ^3 T - while (1){
2 I- U$ M$ H$ U) x2 b3 w, `3 N - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);# V" p; U( e X& O) e7 T. ?5 J4 _" }
- //接收客户端数据
7 [6 j! ~; T/ ?/ ]5 v5 G - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); i! q, ?9 h5 V( F# U
- printf("to me:%s\n",recvBuf);! ~/ U% v j* l N4 a
- memset(recvBuf, 0, 100);# O4 d5 U1 ]+ g- V8 z, A8 l
- }
, B4 x# z5 J+ V1 O( x - closesocket(sockClient);; A' S# a9 C" x1 q! H
- system("pause");
) u6 o4 ?4 O/ s3 J9 y0 t - return 0;2 K0 ?% B% H3 {0 E2 G" }
- }
复制代码 客户端代码:
2 W, A4 P! W. W/ r: l- #include<winsock2.h>
1 r8 k7 Z! J1 g - #include<stdio.h>
8 v: f6 Q9 N7 B1 F: w) y3 I4 y - #pragma comment(lib, "ws2_32.lib")4 I7 ^3 P" A& C# y! G
- void main()
8 ~ i) J: _1 r! O; E' W( q - {& ?( A3 C% o/ H' q
- WSADATA wsaData;& ~" i5 k( b, p7 w5 Z, Y
- SOCKET sockClient;//客户端Socket! W/ t1 y( R% W& l9 A* N0 E
- SOCKADDR_IN addrServer;//服务端地址3 @+ H& Q+ L5 D2 i/ ~; A5 R% K7 b
- WSAStartup(MAKEWORD(2, 2), &wsaData);$ b. C* [( c' r7 a
- char message[20] = "HelloSocket!";
3 _' [. |4 `2 |) W( B |* G - //定义要连接的服务端地址
8 N- L; v7 W$ \) A. t - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
; {( t N/ q7 m" A; T+ y - addrServer.sin_family = AF_INET;
$ P, |$ @3 A0 y - addrServer.sin_port = htons(6000);//连接端口60008 E$ {- N% ~! h% d1 b
- //新建客户端socket+ \9 r2 W9 P; e7 k* ?2 Q
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# i8 R( J t6 p% x0 M' F
- int s = 0;- `( H+ Q& g" _9 j/ Q3 P0 j
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));) d2 Q4 Q( c1 n7 N
- * b/ L2 v; p" d0 a
- while (1){
& [9 A7 V. H" z8 y% _+ r5 L' ? - //发送数据
8 l- y0 |6 C5 o8 y" K - int a = send(sockClient, message, strlen(message) + 1, 0);5 s( e5 }5 |! w: O
- printf("to server:");
# F# i3 T; d, D( |8 Y; ^ - scanf("%s", message);# g6 `. T0 }( @# a z3 l' r' l
# J6 t* Z5 [3 D' I- }
3 Q) l$ K$ ~6 B* ~/ d& f/ } - //关闭socket
( {: c/ _5 L; g - closesocket(sockClient);
4 E: m, U6 M& o! ~( c) Q+ s - WSACleanup();
6 q+ `% Z W3 @8 S9 B, f# G. N1 L - }
复制代码 求懂的高手来解答一下。
* I9 d# x! _4 o8 L谢谢了!9 ^3 f5 Q* T9 \0 o9 w9 \! M3 J
+ O5 {7 C) m0 o/ l
3 G7 |. s, I. z" F0 `( U/ l# U- \' X
8 Q1 a3 B( o7 Q% Q
|
|