大家好,感谢你的回复。- u" u* G) k1 f R8 j9 ~
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
0 G9 S# R' C U6 J RTalk is cheak , show me the code.
, V8 \( v7 k0 U; _% |! j- M服务端代码:- e9 H i2 G: f- [; ^# m6 G
- #include<stdlib.h>
O9 f& T3 f8 Q3 {! C - #include<WinSock2.h># _+ I# O$ I& d, u6 K* N2 S; X! H
- #pragma comment(lib,"ws2_32.lib")
" _0 t, M0 I8 o; Z" | - int main(){
, s2 D& Z4 M; W' T1 _3 p" o - WSADATA wsd;& X0 P1 d* T1 L5 z' o1 [
- SOCKET sockServer;
5 D7 o2 \& ^$ E3 m) \ - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号7 d# ?; U+ H+ D# T, \# }) L# u8 M, z
- SOCKET sockClient;- q: k/ g+ F6 y/ r. M. d
- SOCKADDR_IN clientaddr;5 n F( Q* @8 A; D, p% u+ Y9 T7 f
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口" P) q& U+ R* _0 ?+ W$ ?$ S
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket, I( l8 L0 t1 a _, T+ E
" q& Z0 H0 I- ~; x- 8 I5 L3 x% I* d7 |' o+ B
- if (sockServer != -1 && sockServer != INVALID_SOCKET){! L: S5 S; g4 x9 V* t3 w8 S; u
- printf("Socket has been created :%d", sockServer);$ ^: e! }, n* f1 p; ~. m) |3 o
- }
# d, Y. g9 ]: _/ @; x - else{
7 N9 @) Z8 l9 r; K$ e& X5 g- s - printf("Socket create failed.");. q; Q) q! s q, c- V8 S! U
- exit(0);4 S' s4 n7 h4 R+ C5 ]$ S/ M* r
- }
/ i7 G! i3 y& A; T D - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);' a& ^, a$ N% b
- serveraddr.sin_family = AF_INET;2 P& T( H0 }1 N7 \, V. W
- serveraddr.sin_port = htons(6000);//绑定端口6000
/ M. b& v+ K' Q" P" t! ]$ B - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));+ U! Y; l2 r& ?8 ?1 H
- char recvBuf[100];
) N( T, M. ?- m - int len = sizeof(SOCKADDR);
5 H; v" T- s; K$ ~ - listen(sockServer, 5);//5为等待连接数
1 D3 r$ |4 H" `6 ~4 Z1 t% J - while (1){
$ h; z6 D0 l- M, G/ n4 i( x$ n - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);5 x( A4 d. J) b: j* X
- //接收客户端数据
9 Q6 u. f/ Y: H5 i! H6 S% A5 Y9 T - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);1 U5 x9 I7 q5 x* v4 V) `
- printf("to me:%s\n",recvBuf);
& A+ }: r5 `# C% a6 x - memset(recvBuf, 0, 100);: z: S1 d3 i$ w' T4 |* \
- }1 P. }6 [ b( w( ~: J, X6 c
- closesocket(sockClient);1 u; h* R$ b) k$ a
- system("pause");
! r x$ y" R" |0 r) H/ v/ g - return 0;; G& q2 h: a2 V2 X1 k; i- d& X5 i
- }
复制代码 客户端代码:, b9 B0 @1 H' O% b. [. d
- #include<winsock2.h>
: k- o0 e5 ]4 P4 Q% p6 t - #include<stdio.h>
k9 E1 j7 T2 w8 `( }9 C8 I - #pragma comment(lib, "ws2_32.lib")
( J' j# x) D, s9 t. t" K - void main()6 M; v; P( a5 N+ O: ~! u
- {+ L( J4 h2 j1 g% Y
- WSADATA wsaData;
1 f* {& u0 Z7 [- ^) K+ I7 S - SOCKET sockClient;//客户端Socket
# S5 D. e) C4 t1 I0 o6 N( e - SOCKADDR_IN addrServer;//服务端地址
3 }) \- d+ E( d/ k$ ^; N: C - WSAStartup(MAKEWORD(2, 2), &wsaData);9 D m' }% `+ a0 @" X7 U. `$ G6 ~
- char message[20] = "HelloSocket!";
1 b$ A8 _2 U, S' e0 j% y - //定义要连接的服务端地址
0 T. y/ }7 o W* S" v5 c - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
- ^( c) ~- G0 _2 p - addrServer.sin_family = AF_INET;- D/ a2 g/ n2 K& H, t
- addrServer.sin_port = htons(6000);//连接端口6000
- X) r! M K1 \4 \! a+ t' w - //新建客户端socket
" ]# f; U: D4 T0 S- I5 a( j" e - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/ g+ D5 x4 Q: E - int s = 0;% G7 P' h* d0 A1 R
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, |4 \& J- i$ z( N
7 K" ]- }/ |- X' f( Q+ i# n- while (1){
% q1 g- X# D" U' A2 D6 q - //发送数据
) y- h4 e6 z9 |# R) ~ - int a = send(sockClient, message, strlen(message) + 1, 0);
# I2 `) P8 d: h( J - printf("to server:");7 j0 k3 @* B$ h
- scanf("%s", message);
( ~1 o* [8 G8 q8 c& u - # T( K; I- W- O6 e' u9 _" X
- }9 _6 _, B4 K3 ? `
- //关闭socket' W( ]& X1 i" R6 d, C
- closesocket(sockClient);8 B6 ~) _5 x) V B9 Y
- WSACleanup();
& K! Q. k' d# Q% D - }
复制代码 求懂的高手来解答一下。
3 \# k. W% @- v谢谢了!
; Y0 C) ]5 y- u8 q2 a) Q$ L
7 n* h& r2 h; ^8 s; p7 A0 W) P1 E% J3 q; C) K) t+ U
( z& q2 i, r# y% F! C% P |