管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
# `4 _+ Y/ B, a+ t4 z2 S2 R( _5 l我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。$ z. x) h9 ~/ D2 @4 M
Talk is cheak , show me the code.& ~9 W6 i% N! g, v4 `/ p( W
服务端代码:
- C+ ] Z* |1 |' O* B9 g/ Q9 I- D- #include<stdlib.h>
' u( E/ F, N6 Q$ Y: k3 K - #include<WinSock2.h>
/ G- w1 D; }: J6 \4 E - #pragma comment(lib,"ws2_32.lib")
s) w' W6 {6 \9 \ - int main(){5 S8 ^- T! E" ?, Y: T# K
- WSADATA wsd;
5 ^% a" J1 C8 o: n - SOCKET sockServer;
" n/ n& }2 ~" v7 C( l - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号+ B, i' ?! Y4 ]1 y+ }% p
- SOCKET sockClient;
% i" y' d# X5 ~. M/ h: _6 M9 X - SOCKADDR_IN clientaddr;
3 H l. @4 A- l - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
' B: m+ U. ?0 d/ m* } - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" B5 W8 ~7 u9 s; p4 y, a - 2 |, |& Q8 ~* Q+ }: Z
- & L) e# A2 q: G9 f
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
6 j/ D4 c2 z" V - printf("Socket has been created :%d", sockServer);: B- w+ q0 e8 X( c
- }. f2 C# ?" ^8 b8 b4 n8 i8 x/ t8 Z. ^
- else{
/ _& K( N4 O/ X/ E1 n8 X - printf("Socket create failed.");( Z. C0 N/ ^7 G% ^( b5 t
- exit(0);; G: U3 e7 q& A! I2 r- y8 H
- }& `; j1 N% z. Q. m( P4 W( T7 k, T
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
* T# s0 @6 t0 k7 R$ @, D - serveraddr.sin_family = AF_INET;
" h) ^. a7 Y0 e: J- C: F - serveraddr.sin_port = htons(6000);//绑定端口6000
6 k! X6 X/ w, e0 l+ H. s5 \ - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
; t0 A( h, Y" `, a! J* i - char recvBuf[100];+ g- m( p6 ^: T- t% b$ I: K4 H; a
- int len = sizeof(SOCKADDR);3 X! y1 E. K- x0 C
- listen(sockServer, 5);//5为等待连接数
% \! F" K3 ]9 t6 `. t - while (1){
9 G2 g! c! D) A- h" Y- w* A# v5 X - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
" w3 Y+ d; f% C3 T7 J4 K - //接收客户端数据$ G# u5 p+ N9 k( q
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
6 b% u% ^8 K' c2 b - printf("to me:%s\n",recvBuf);
9 e% [& K1 s' L+ r% ]$ U8 S* m - memset(recvBuf, 0, 100);
4 v/ h$ U3 H) c x - }% p5 A+ Z {! D) R! W; W
- closesocket(sockClient);0 H, n/ W; V" b
- system("pause");
2 O+ K7 S1 Q" v" a0 H! b. M - return 0;, p/ v+ z' ?" {( ]& Q
- }
复制代码 客户端代码:5 s2 I8 `% x2 M7 l) A
- #include<winsock2.h>
" C2 o X, n. _0 \ - #include<stdio.h>
: `6 i! n. y( r. P1 j Y0 M - #pragma comment(lib, "ws2_32.lib")0 e; L) O' A2 W) b* x7 _8 [
- void main()
/ L9 c+ R# l/ y2 j - {
/ a+ ^1 Z r1 }# M2 Y - WSADATA wsaData;# K' E5 o2 _, J2 u' _' H
- SOCKET sockClient;//客户端Socket* z" I9 H9 f0 k
- SOCKADDR_IN addrServer;//服务端地址2 @. h J, L" _. i
- WSAStartup(MAKEWORD(2, 2), &wsaData);: g& V+ A% p% a \& }5 L
- char message[20] = "HelloSocket!";& B1 C9 h! J) k4 o' k
- //定义要连接的服务端地址9 M' H1 e+ G- T$ T8 Q2 p. D j
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
0 S- m* n% `3 H - addrServer.sin_family = AF_INET;
6 ^8 l( k/ W: l& V- E - addrServer.sin_port = htons(6000);//连接端口6000
) R# v8 j3 @0 [% w: e: \ - //新建客户端socket: y9 M, T: y+ s- y/ z2 a
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
; I) I, ]$ t3 ~7 e% v! Z - int s = 0;
" `8 s; o: v" ^6 t7 b% u# `6 ~+ a$ ^ - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));* q8 Z6 G7 L9 E: W9 C
- 8 f4 X$ l$ z1 a0 L
- while (1){5 }- m! C T$ W3 e! p; q p
- //发送数据" Z, b- G; c# h% C# |. t* y
- int a = send(sockClient, message, strlen(message) + 1, 0);
( e/ I9 ^5 V$ C4 `' x0 x9 ^+ q - printf("to server:");3 C# |! I5 [- |; u- g4 K
- scanf("%s", message);
( }( U4 ]" [5 X6 t
. s% L5 M& T: e& n( j2 J u/ G2 L- }
5 F' d8 {* [6 a4 f3 ^5 p3 X( ^1 r - //关闭socket/ ]; `$ N$ z: F/ J
- closesocket(sockClient);
1 O; H7 v: K" O A) s$ H; K9 V" C - WSACleanup();" l/ o0 W1 E2 L1 ]; [/ B$ @
- }
复制代码 求懂的高手来解答一下。
# z7 y8 U2 Y+ c$ h( p) v谢谢了!
3 g' z) s; m. D7 q" O4 e: u$ @4 a0 {" q; {) ]. P7 d7 v
% O9 H4 Y& q k* z5 H# H/ i* i u" C- X& r) s$ ]# ?$ n
|
|