管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。3 f& _# x1 q3 p# {% g
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
; T! x5 z2 H2 k l6 B8 N2 H3 x. gTalk is cheak , show me the code.9 j9 \' P0 {- D8 L2 X5 u. s v; e
服务端代码:
6 E i( L' y4 S" N1 u- #include<stdlib.h>0 j. x& X/ O6 A+ n/ K1 U8 t* V) P1 q( Z
- #include<WinSock2.h>
4 j- i5 D& t: y - #pragma comment(lib,"ws2_32.lib")# y+ |( f& u' Z( i. u
- int main(){' Y2 n) o" G+ p: b M5 V4 p! Z1 y9 `
- WSADATA wsd;: V4 |% W( \) l4 F( s" o! l
- SOCKET sockServer;- S$ a8 f9 B* l8 V' S2 z
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号) Y7 d3 b. R8 C9 h1 T
- SOCKET sockClient;; `) o/ w7 y1 Z8 @0 d7 Y
- SOCKADDR_IN clientaddr;; I5 w% K. a; S: [5 ?: q! @/ _4 U, p7 R
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口& ~, F% E4 h3 [3 p+ J4 j
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket4 _& U3 y6 }; H9 A1 F, s% u: j
5 ^, L* ]* Z: l* F3 T- 3 V5 P: r1 Z& ?
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
% N, i- @ e) c0 P8 q& d - printf("Socket has been created :%d", sockServer);+ ^% P4 V7 ]8 f1 s
- }& ]" q6 W) W( @& k" N
- else{8 c. U& R ^& z4 Y
- printf("Socket create failed.");) k H/ B* R6 G+ l
- exit(0);; R4 N, {" K* e( X% l0 _/ b6 c
- } z+ O- g+ F* }7 G3 c: l
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
9 U0 n! W9 g/ u( A - serveraddr.sin_family = AF_INET;4 O. [4 U' n: l
- serveraddr.sin_port = htons(6000);//绑定端口6000
D+ B/ q1 |5 @& U6 q \) ]# V( @ - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
# X% {* E) r# q: P+ k2 V I: g - char recvBuf[100];
; y U3 z( h2 N2 Z) o( ~7 f( z - int len = sizeof(SOCKADDR);
: h2 F9 k* J- F - listen(sockServer, 5);//5为等待连接数
4 R0 `! h+ u/ H( N( Z2 B - while (1){5 l3 Y& t" y/ |; o( f
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
1 L }5 o3 w1 ?" [$ T$ i' Z7 Q8 P - //接收客户端数据
- ~3 ~1 q4 n2 u& a9 g4 B: m# T - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); a# D! [) H& W! C; B6 J7 Y
- printf("to me:%s\n",recvBuf);
) @2 U0 ~; t/ i$ \) r - memset(recvBuf, 0, 100);% r- ?* E+ Y5 W9 v+ o
- }
1 R5 j6 m) Y0 s/ t0 F6 U& v C - closesocket(sockClient);
0 A/ Y6 \, ?$ ~! t$ M5 B- u0 j1 b# s - system("pause");: S: e) i8 P7 F3 F0 N$ I
- return 0;# \$ J# i5 ` Y
- }
复制代码 客户端代码:
' E) k' v. k) r4 k, Q- #include<winsock2.h>
' o8 a/ _ C' L - #include<stdio.h>
, ?" _" o: ^& ~2 n - #pragma comment(lib, "ws2_32.lib")0 Q& k& D/ r+ K: e0 c% H
- void main()3 I9 S+ [0 D6 Z4 p! F: Q, z& x8 g
- {: k- ~ t( C& E; h! f M
- WSADATA wsaData;
0 [7 f% S, k# _4 H - SOCKET sockClient;//客户端Socket: ]( X# |# |7 q8 z' k
- SOCKADDR_IN addrServer;//服务端地址, K. e q9 v5 z$ f( y( A
- WSAStartup(MAKEWORD(2, 2), &wsaData);
: B1 @1 D7 E4 i$ \" c - char message[20] = "HelloSocket!"; n* }9 @' e2 @5 u& g: ]
- //定义要连接的服务端地址# Y5 v2 P6 c6 g/ S+ g
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
+ ~( G+ T$ ~# I; a, V" h, R* w - addrServer.sin_family = AF_INET;
0 ^/ I& x, H2 ]% i - addrServer.sin_port = htons(6000);//连接端口60009 ^: j6 a9 ~ i6 W% I. D+ A
- //新建客户端socket9 z/ v9 P; ?) k4 ~" e# X$ A
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); n+ n1 N) X8 _; Z; }( B6 r
- int s = 0;
4 y2 j. f1 O1 c( n - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
/ p: ^7 E! ^/ A - & c, L+ s4 N6 @2 C
- while (1){
3 _0 C9 N7 S! d5 I8 K9 O - //发送数据
* s: A3 m5 }5 P3 ]" G4 J( }5 A - int a = send(sockClient, message, strlen(message) + 1, 0);
5 w4 Q; g6 Y% I/ f( V; b - printf("to server:");
6 O5 D2 G% ^9 G4 x - scanf("%s", message);: I& s/ p4 _8 K6 K1 G1 V
- / y9 n2 N1 ]/ ?! Y: Q# _9 `0 q; n
- }4 Q. z' n8 T2 _" [( x. q( H
- //关闭socket
) l) m( m, P, t - closesocket(sockClient);3 s0 q" P2 Y7 ~; q8 T2 Y
- WSACleanup();7 e7 H$ W4 Q2 u5 M0 \8 d
- }
复制代码 求懂的高手来解答一下。
( Z, O$ U6 | t0 `" n谢谢了!
, N. K3 J! B( K
% G, p3 M1 I5 O- E% p
. H- C: `+ ?2 L
" m Y9 a9 c" z1 g' t- Y2 B' U |
|