管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
* O% u" j1 U5 h! P我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
/ `, p/ }/ j O" o5 p. D# y! E8 T. kTalk is cheak , show me the code.
9 f9 c$ Z7 I1 @5 F) r4 R; ~ M服务端代码:% \$ ?+ m/ o* Q2 T5 u; {+ Z
- #include<stdlib.h>
5 m! E. j2 v2 {+ n3 r' W2 t - #include<WinSock2.h>
# L S$ R2 ~9 ~. t; m# l3 Y& ^ - #pragma comment(lib,"ws2_32.lib")
1 B/ s* z$ A0 Z( r- J% X; z- @ - int main(){( _- y8 c, w) H& l
- WSADATA wsd;2 j$ y4 }4 [, a. I4 s0 W6 Q7 A
- SOCKET sockServer;
]6 g- r0 q% u: M0 B1 G - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
* j3 T! A( y- E- T - SOCKET sockClient;% s7 r8 W$ U# y# r, z! `
- SOCKADDR_IN clientaddr;
' H" O8 |- A. n1 t, W$ ~ - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* x% O* l1 a% q, w
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
- X7 o$ A# Q( d/ a
" B2 y+ k1 |; ?6 i; Z6 `% x
; k3 y5 |* I9 A9 ^% l! i- if (sockServer != -1 && sockServer != INVALID_SOCKET){0 W: `6 w/ ?6 \: A1 r0 p( f
- printf("Socket has been created :%d", sockServer);
K1 v+ X6 V7 M9 L! q - }
8 Z" u0 O: J0 e V0 m8 C - else{
9 @. W" y& k: x# s4 _1 P6 T - printf("Socket create failed.");
L8 O. L, g6 [% o - exit(0);
8 \' _( i* z( d/ C9 E4 y - }' r& v6 A; o9 i" q: Y
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
: f8 h1 b5 h! G - serveraddr.sin_family = AF_INET;
% o+ ?$ [2 }6 H+ D - serveraddr.sin_port = htons(6000);//绑定端口6000# W: @6 g! Q# W' U
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ [! A0 s: x, O% E' c
- char recvBuf[100];6 U8 Q9 {, t9 B+ C
- int len = sizeof(SOCKADDR);) [. H0 m |% U
- listen(sockServer, 5);//5为等待连接数" X: v1 @* B/ Y. J
- while (1){# g( q+ `4 |4 q0 A8 E4 B
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);: p ?/ t# ] t, d. N; B1 E
- //接收客户端数据
7 `, B- v' A+ x# @. o0 z - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);5 U3 [+ q" ?! K; z5 \
- printf("to me:%s\n",recvBuf);$ A) h/ i" g1 S
- memset(recvBuf, 0, 100);. e5 S, H. j& ~" k
- }
m' d. _6 Y. D6 v5 ~' P9 [9 x - closesocket(sockClient);
7 y1 x% d" M0 k7 L, h" x7 x - system("pause");- i6 `# f. v' |
- return 0; ^1 z8 e4 N2 h5 A2 K$ M. |
- }
复制代码 客户端代码:
# z8 M$ E4 T+ L' W+ q$ ]. b4 s! k- #include<winsock2.h>
2 X9 M. M, W8 H( o2 R - #include<stdio.h>
) e5 z/ s" q4 f$ W& V5 Q; L - #pragma comment(lib, "ws2_32.lib")
% i( K4 }6 ^5 s$ N; ^3 Z - void main() t$ T5 ^6 D6 {/ r! H8 a+ r
- {% b: v$ Q8 v0 j. x3 M
- WSADATA wsaData;
1 K( S& i) x& x; A& \- ?, o" ` - SOCKET sockClient;//客户端Socket6 {6 d: f; b7 A% ?6 Q4 F
- SOCKADDR_IN addrServer;//服务端地址. G7 C+ q. \! D7 H1 @4 U
- WSAStartup(MAKEWORD(2, 2), &wsaData); n3 B0 G O8 }+ ^# S7 y" }
- char message[20] = "HelloSocket!";
" j9 J E+ t* t1 b9 r - //定义要连接的服务端地址5 I0 U2 O* p0 u
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)1 u4 a( q, |! p. ]. `
- addrServer.sin_family = AF_INET;
8 ?9 K9 l% K* @ G0 {% a - addrServer.sin_port = htons(6000);//连接端口6000. `: z% S: F9 F( f7 {. e
- //新建客户端socket
2 W: m" b( T- u( _ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( `: K5 K% L0 B0 }+ ^
- int s = 0;
0 @0 G4 T5 B, z9 P0 X: p - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));; W0 t$ H- e/ n% Y
- : z' `0 `# T4 m1 l
- while (1){
0 Z; k) ^( `8 A( I6 J - //发送数据2 l0 }2 n2 d% B/ `5 V( d
- int a = send(sockClient, message, strlen(message) + 1, 0); ]% e) r; H+ D" E- i6 w
- printf("to server:");" A3 R0 @+ {8 R/ `
- scanf("%s", message);
& C8 m: j, n6 I G; ?1 W
+ }5 q5 m8 {% X/ P- }
2 u1 f( _8 |) o; S+ A% f - //关闭socket
( e/ Q' c( h! q# p# [5 u - closesocket(sockClient);
4 g* \2 V' Y# X! s6 O0 B$ V - WSACleanup();
# n# N6 H+ m( _5 W% ?5 U - }
复制代码 求懂的高手来解答一下。7 g- H2 l* k% d2 K) Y9 {0 P
谢谢了!
5 w7 r8 @$ R, f, C/ F5 d2 C) q7 \0 @" [" O R
( f0 Z. ]6 a l7 I' x
; P6 s6 ]+ ^0 d# l" y |
|