管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
. R. g9 H7 |# m7 j0 b5 u7 s) d我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。1 Y) q! l& T9 {/ B& [+ Q' u
Talk is cheak , show me the code.
9 a+ e% ~0 S' ~/ n$ _! c服务端代码:
, c1 S! d! L( X9 @- #include<stdlib.h>
, ]1 T7 C" f! n1 ]: N( Y3 L - #include<WinSock2.h>) k1 t } M9 ~7 [; i7 ~
- #pragma comment(lib,"ws2_32.lib")( t5 [: c$ d6 a5 P$ K4 j
- int main(){
. ~# g6 O; w+ V% ^, X - WSADATA wsd;
8 ?! f5 C* M {" B. m ?! q5 E - SOCKET sockServer;
% t9 k$ ~9 T# l1 @- d% D/ J: o2 p6 H - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号) Z0 u- w! K5 R. K8 l- f
- SOCKET sockClient;
8 w0 ^2 g; l; w: `3 O; [' Z, D7 k - SOCKADDR_IN clientaddr;% w8 h4 f7 k1 L5 J
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口) e- K- g7 u9 n' E, e8 V% s6 }* i
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 v- p. I2 b5 }
% u1 J7 S$ O6 V( _. q+ R1 f
9 O; `) X; e$ c5 D- if (sockServer != -1 && sockServer != INVALID_SOCKET){
0 w w7 S8 P6 B% \/ l3 l1 V. O - printf("Socket has been created :%d", sockServer);
C5 R4 v/ H8 }9 D/ d& K - }" h1 t6 ?& U) G9 P, I
- else{
9 I9 \- x1 z% D: V. d8 m* z" a X - printf("Socket create failed.");
" M8 ]6 O3 Q' n( x - exit(0);
R6 H6 P- u8 P/ b8 x/ n! b( X% J - }$ D: C V U" c4 e' k
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
9 W- F) ^! `0 x; u7 C - serveraddr.sin_family = AF_INET; j7 P) a* k O! i9 ~+ w, v
- serveraddr.sin_port = htons(6000);//绑定端口6000
' H: u& g- j4 H7 B: d - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
) k; j. o8 F9 v" K1 d, B% B$ \: M0 E+ u - char recvBuf[100];
$ [1 U6 l& X3 T( ^ - int len = sizeof(SOCKADDR);
/ A, M- g/ s0 [5 n - listen(sockServer, 5);//5为等待连接数7 _4 U( y% `8 c/ A
- while (1){
; k N' Y$ ^1 K2 @) L, G+ H$ i - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
6 O( Y- t. H5 F7 Y* k - //接收客户端数据8 o, z F5 K; ]+ U. R/ ?
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
9 F) g2 l7 ? c0 |6 Z3 ]. q - printf("to me:%s\n",recvBuf);" X, h4 @4 F0 u) s$ N! }/ K3 P2 O2 x1 \2 x
- memset(recvBuf, 0, 100);/ t+ W" m$ }1 `7 {
- }$ G7 n+ f+ D$ S! J
- closesocket(sockClient); \/ H2 S7 q0 V M- O& n, p
- system("pause");
$ y; \+ g, ?, s3 O G$ G5 G: O* c) O - return 0;1 C* ]) |: a3 x9 r( w# H, |
- }
复制代码 客户端代码:
/ R) g3 c7 I8 P( w- #include<winsock2.h>
3 a+ `. R; q5 w, v' _ - #include<stdio.h>/ C6 s3 S# L( U2 e6 |
- #pragma comment(lib, "ws2_32.lib")) h7 a9 p# s# ^7 \* L! e! d
- void main(). J( {) d- M- c3 H$ w+ w4 q9 F" S
- {
3 e4 Z0 N+ o$ j: B, t4 R - WSADATA wsaData;
" ?3 `' x, d) {! A - SOCKET sockClient;//客户端Socket/ S- U. _0 J& S# x9 a, C, k, F
- SOCKADDR_IN addrServer;//服务端地址
/ k% G$ W5 M# L8 z8 ] - WSAStartup(MAKEWORD(2, 2), &wsaData);
4 u6 \ O& n/ \7 [ - char message[20] = "HelloSocket!";9 H1 w* S! a7 ~( K; | V
- //定义要连接的服务端地址6 i; f _. t1 ^9 A5 n' r4 S
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址) V, q1 i- s% N* Y5 E* Y
- addrServer.sin_family = AF_INET;
7 K; Q/ p! C$ |6 u+ W+ R - addrServer.sin_port = htons(6000);//连接端口6000
6 `# v; J/ i) J# y9 G0 k - //新建客户端socket' n3 G: L6 Z/ r1 W2 k
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- W. ~0 V& s/ N* ]3 P8 l$ t6 E - int s = 0;
/ F5 h' s2 [* K5 X - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));9 ?7 ]- s; q" }: `5 B5 @! `* D2 B
- 1 l. S, `* n7 D# q( E
- while (1){' R8 c4 s. V( S y, }8 S/ C' T
- //发送数据 F% T( o% U1 U3 E' p' ?, p
- int a = send(sockClient, message, strlen(message) + 1, 0);
, ^: v! J" N' @6 X - printf("to server:");
( H0 n' Q% w/ Q8 Q# p - scanf("%s", message);0 q8 M2 t1 f) u' I" H2 `8 ~7 W( ?
" y/ z+ a; y! o6 m; y- }
+ B- [2 h6 Z8 X8 l% i - //关闭socket' h/ K' ?4 S8 P1 ], m$ D5 o
- closesocket(sockClient);
* L( r' y: }5 ]3 m T8 H' O" m - WSACleanup();0 }3 a& T. F) m; {8 W K& x6 e8 q" `0 @
- }
复制代码 求懂的高手来解答一下。
0 P) X- k. F/ t+ C谢谢了!
0 T: V" [0 B: k5 V. `; Y
7 f/ D& Z; S: n7 j
1 g8 L$ Y* v+ h
) x, x7 \: m# V1 o1 t |
|