大家好,感谢你的回复。6 R1 }; n' P3 i& O$ e
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。, ~% O: a' m; T5 v) f: _+ Z2 c
Talk is cheak , show me the code.
1 l. K9 }, W! a% U服务端代码:
1 k% S$ o+ M2 i. }( V- #include<stdlib.h>$ [& Z- h3 P) ]. F2 `
- #include<WinSock2.h>/ G: Y( z/ |0 h/ w3 }
- #pragma comment(lib,"ws2_32.lib")
% a% ~4 e9 r+ f1 g8 n - int main(){
: ~, i# _% U& d$ _1 H* W1 _ - WSADATA wsd;
; e0 n( V- ~( k3 N. j - SOCKET sockServer;9 S8 S6 E @0 x6 f
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
9 L" @3 J1 B. i/ i - SOCKET sockClient;. Z0 \$ Q* |) y$ V7 v: C
- SOCKADDR_IN clientaddr;& Q! [) f5 M3 g# {
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
7 `4 j, g6 e" ^( t; O$ K - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
% W0 v" s/ p- Z! D. h+ b* ]
6 L) {: q' R) l# e9 A- 2 h* i# C: U& ^
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
% H* I: b/ g# Q) X) H% B; A& t* F - printf("Socket has been created :%d", sockServer);
6 R0 @1 L# F. \9 U% H - }
7 t# n2 J8 b! M7 L1 D G - else{
1 ?; {5 ~1 A3 I0 v5 c - printf("Socket create failed.");
: o) N2 X3 v+ |% I0 ?! Z - exit(0);6 h" ~: \9 m! \6 {
- }- `; V$ T5 S& i& i/ X! K6 V
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);5 ^. d. l6 @; z5 g% F) E3 U
- serveraddr.sin_family = AF_INET;5 @ ~1 B0 n3 A( X
- serveraddr.sin_port = htons(6000);//绑定端口6000
/ B& G. j; ]( |& z - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
( {, Z. v5 ?9 l# q0 l) n - char recvBuf[100];6 l7 X8 I( Q" _
- int len = sizeof(SOCKADDR);
6 C6 J% f4 O* d! Y* l2 E - listen(sockServer, 5);//5为等待连接数
; s8 N4 j4 ?/ |* i2 X N% @ - while (1){/ Z. [5 R6 P" h/ r* t* ^
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
9 G. i3 A' u0 x4 ]. e& q: P - //接收客户端数据( o/ s- I; Y* Y
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);6 j2 s. o7 D" t8 E
- printf("to me:%s\n",recvBuf);( l2 o8 x- V( I0 h0 H
- memset(recvBuf, 0, 100);$ j( V; M" w E: \% D4 K: s
- }
8 C! i0 s( ]0 K1 ?4 i - closesocket(sockClient);
! T8 f- s+ t( x* [2 Q7 \* i0 ^5 H9 ? - system("pause");
" T+ \8 J9 S, W' J2 B" v - return 0;/ K! [' q4 i$ x1 e1 ^
- }
复制代码 客户端代码:* A$ I; j# p6 k: s' [- c6 i
- #include<winsock2.h>
/ q" Z- ^7 w4 d8 `! t - #include<stdio.h>" K. [: e- W; N6 {" i7 H) G2 e
- #pragma comment(lib, "ws2_32.lib")# q7 C- v4 i; ] D. m+ F# t
- void main()3 y! A2 L7 s' w7 r4 ^% U; l* ^! b
- {
6 }* |, n; q4 U" w) H - WSADATA wsaData;
6 E0 n# e" d' c8 D( w v - SOCKET sockClient;//客户端Socket( R7 M% `" o: N: ^$ m; H# g; ]
- SOCKADDR_IN addrServer;//服务端地址
$ k" K( k: b p2 B N - WSAStartup(MAKEWORD(2, 2), &wsaData); I1 V2 |& c3 ]9 T
- char message[20] = "HelloSocket!";
- f, @ @. o' q# s: L, B$ ?. w - //定义要连接的服务端地址
& X1 m' {3 Q, f9 h' Y - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)% S# Y6 {$ D, n4 U' o7 @# R% p
- addrServer.sin_family = AF_INET;( J/ X N- z, C: f: I
- addrServer.sin_port = htons(6000);//连接端口6000
+ ~4 e2 {9 c; o. d - //新建客户端socket
8 b: g2 Z8 {9 ]5 c# R | - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( y0 e$ J5 Y7 E( _" h- I
- int s = 0;
. T5 @$ J- ^8 I+ d9 L - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: J+ g- O: e7 y6 z0 L5 q
- 8 V1 X1 J- K4 f! |" W
- while (1){& Y' b* B3 K2 w, p/ _
- //发送数据, S. I. a; j Q8 v
- int a = send(sockClient, message, strlen(message) + 1, 0);
: w6 W2 m6 x; q/ p! V3 b - printf("to server:");
/ \3 f6 S9 T) }6 K# k0 [8 v - scanf("%s", message);
: G$ ^+ p/ W9 |. z
9 M$ d1 ?& [/ L, C& f- }* G1 ^7 g. e M# Z- {4 P% }
- //关闭socket1 M# Y! u6 `2 F) N
- closesocket(sockClient);
2 M0 h# a4 M) A2 e: r: L; @ - WSACleanup();3 `9 P1 Z# a0 `" q/ `4 n }
- }
复制代码 求懂的高手来解答一下。
9 B& ^. S/ q) L0 Q+ o2 x; e: \谢谢了!
5 x& [9 Q3 ~- \5 M5 p' v7 Y2 O3 R$ A: W4 }$ B! P
1 Z7 R4 ^% ~7 _2 ]' V
% Q4 R4 s" M5 | |
|