大家好,感谢你的回复。" F- M2 ?$ A$ ?3 A0 ~, x
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 S& _. c |4 a3 p
Talk is cheak , show me the code.- G* H {6 P3 ^4 P; k
服务端代码:
& M# S, d; Y3 R7 S- #include<stdlib.h>
; c X" k' i' ^3 k( u - #include<WinSock2.h>% V2 H- b+ }8 Y( B6 Q U
- #pragma comment(lib,"ws2_32.lib"). H: M- ~& ]9 b
- int main(){
9 `% x5 O+ i- ] Z - WSADATA wsd;
9 f, |3 ?! q' ?+ @/ h# p - SOCKET sockServer;
% V! i/ v0 l2 ]% W - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
9 v. W" q. @5 R& s& {1 ` - SOCKET sockClient;" j" z0 D, n: P8 F
- SOCKADDR_IN clientaddr;
w% ~* `0 d z - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
- M( Q4 m6 K& O - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" H, v2 b& |0 S6 }! m4 H - 8 C' r) A9 p9 h) S
+ Q: w% K, W( X- if (sockServer != -1 && sockServer != INVALID_SOCKET){6 L0 z6 s+ g" [+ @0 Q Q
- printf("Socket has been created :%d", sockServer);
6 @! K) C. `* u& s - }! ^( l8 C# n1 U( S0 f
- else{
" o k+ y) L, A3 Q3 {% c/ { - printf("Socket create failed.");/ r3 u3 ^/ ]3 d0 u
- exit(0);
V- B y: x$ r& I4 X4 a( N - }
. g# z8 ^% _. O$ p2 O7 b - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
. u8 ]/ d" G- n9 o# G7 Q - serveraddr.sin_family = AF_INET;
* R) b/ A1 i2 R! q/ E" Z3 Q - serveraddr.sin_port = htons(6000);//绑定端口6000
. {( U$ e9 a2 y9 T4 f - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));3 W9 V6 f4 s' u9 Q
- char recvBuf[100];7 Z- U9 E4 H8 R7 h3 H
- int len = sizeof(SOCKADDR);( x' K0 e$ z( {% s( Q9 q
- listen(sockServer, 5);//5为等待连接数, A* I- w. I1 `6 ^+ c
- while (1){, ~- J M* g6 B7 r% S; O! J3 S( I
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
; }. H8 K' E' k7 d; s2 U9 E - //接收客户端数据! y, _. e; k( ?- m2 v. s% E
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);" N4 m! F4 L. v+ @" S
- printf("to me:%s\n",recvBuf); V' n6 S* i. N. |# x* j+ S
- memset(recvBuf, 0, 100);
; e0 d4 R# h7 w - }* S( c- \3 ^* P# \& R, A1 a1 `
- closesocket(sockClient);6 A3 Y/ R/ e' N: I
- system("pause");/ p1 u6 Z# @1 ~6 a* A5 {5 E$ T. D
- return 0;- B: R) r. {# Z. s
- }
复制代码 客户端代码:
% v0 _8 w7 Y3 w/ A; W) W- #include<winsock2.h>4 N& R( u/ k" e' n; \: }% `
- #include<stdio.h>/ N/ \; {% c& Y) z; B! I
- #pragma comment(lib, "ws2_32.lib")% a: n( h* F5 ]0 i" B5 v
- void main(); [4 }1 ]+ x* A) D% g, T
- {
_ O( f$ @ o# M. ^3 W - WSADATA wsaData;+ P$ I/ y I9 W
- SOCKET sockClient;//客户端Socket' d. b7 P: [' X; y7 r
- SOCKADDR_IN addrServer;//服务端地址
y$ q: Q1 w( G: j6 n; H& G - WSAStartup(MAKEWORD(2, 2), &wsaData);
% |5 }/ h1 s- u; {1 Y8 i - char message[20] = "HelloSocket!";$ Y+ _5 W- `; Y: z
- //定义要连接的服务端地址
; d% m: K! D Q5 f# O2 X" w - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
) m# {' k' x0 S% @* }* D - addrServer.sin_family = AF_INET;9 v2 x+ v! O8 b6 }# \7 I
- addrServer.sin_port = htons(6000);//连接端口6000 b# Z2 b3 @' s) P
- //新建客户端socket8 M0 E% g! T9 Q& G, ]8 E
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
( z& [3 ?/ A/ |/ [ - int s = 0;
7 |2 R' {, K2 @6 [ y2 x/ E - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));% F5 T1 X4 m1 s5 L- [5 f$ [+ g
- * v% E7 D1 C+ O! i" V; m, p2 f2 I# Z
- while (1){4 l, r+ j. u8 B, B& X( b% D9 G$ Y
- //发送数据
T: i- [" y4 L+ f m. J6 U" F - int a = send(sockClient, message, strlen(message) + 1, 0);
. d* Q+ R- ]$ f/ s# ]+ e1 S - printf("to server:");+ O0 X1 q7 U' v, l9 l+ x
- scanf("%s", message);
: Q* ~3 S0 P, s$ T* k- r
5 d3 k, w% K5 k4 c# p- }
$ V- R! `# E& } - //关闭socket, T7 \3 T! U% }
- closesocket(sockClient);
, S, ?' L4 e# X3 Q4 S* `; L! f - WSACleanup();4 e+ G% a; h( I! t
- }
复制代码 求懂的高手来解答一下。* n Z0 D# Q6 J1 q" o
谢谢了!! C G- M# P5 ?
' ~5 ^" q; l( x. V9 g# z9 v; b4 B1 @6 K: ^" E& W |# x" \
, c$ x$ _, q# `- V- e |