大家好,感谢你的回复。
9 p2 }$ J' L1 \5 K& Z: B我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% g: e5 K5 U! R/ b8 X' ~( fTalk is cheak , show me the code./ D4 L, g- `4 n5 [. p& g/ |* ]7 w2 t
服务端代码:
/ b' V {8 G* G( e" d. @% `- #include<stdlib.h>6 ]& x; U# o) J7 a6 B- T
- #include<WinSock2.h>
5 n2 g- I+ i' u( }: a - #pragma comment(lib,"ws2_32.lib")
W/ L7 z+ ~3 y- ]- n% Z9 V - int main(){8 f- j# a% t3 F8 n0 @/ M
- WSADATA wsd;
0 p {% g7 S% f - SOCKET sockServer;
1 e4 {! S5 T8 f) G/ z2 ` - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
2 `* x9 I( T) ]9 Q& G) h4 x7 N - SOCKET sockClient;
5 }+ m# c c$ v* R4 x9 O3 ` - SOCKADDR_IN clientaddr;5 m$ t: Y/ M; W7 C- v2 t$ i+ b
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
. y: ^1 S1 @# C* L - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket' R' {5 K% s. z3 g! \# R& t+ U" N! h
- ; I0 w6 C0 c9 e0 p
# d; Q: B$ u$ ?/ {* o8 N6 l& g- if (sockServer != -1 && sockServer != INVALID_SOCKET){
* {% ^: J! M9 y- o5 j - printf("Socket has been created :%d", sockServer);7 |( T: A# Z# p1 V3 z& L" y6 u
- }; L1 c6 S* A" c5 Q7 S+ h+ ~ P# ?
- else{
5 {3 \8 g3 y( Y0 ~ - printf("Socket create failed.");0 o. n2 U, o: T/ ?' ?4 ^" F
- exit(0);9 M! M# S& K/ X0 x* C' r9 I
- }
2 f* [: l: E& U8 |( v - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
" N1 y8 V! i2 Y1 W0 Q- e - serveraddr.sin_family = AF_INET;
% n, y) y5 G8 q: ~0 i+ ` - serveraddr.sin_port = htons(6000);//绑定端口6000* j$ m8 F+ D" Q# e
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
4 _1 h. ^2 v# `* K4 { - char recvBuf[100];* Z# U& I; [4 J; ]& L4 Z
- int len = sizeof(SOCKADDR);& l7 n/ V( t: |3 a7 t4 e; H4 a! H
- listen(sockServer, 5);//5为等待连接数
6 z& A2 ^. p0 n9 h6 U& B( i - while (1){
0 N6 t, `, \8 Z! l9 D( g - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ C# b$ \* w3 t
- //接收客户端数据
9 V: W+ g! }' X/ I8 z1 N - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
, J4 ?3 B3 F* T9 b4 q" J - printf("to me:%s\n",recvBuf);
( e+ G" s b( s! |0 p2 e - memset(recvBuf, 0, 100);6 C# r+ X& U% I/ z; ?5 ^5 T2 C
- }- L+ |1 n9 C- I& c8 ]/ |2 Q
- closesocket(sockClient);
% t5 Q$ i* K4 _' p - system("pause");" K) N* E# d3 p
- return 0;, O* K" g& k9 j9 ]& q6 `, h5 L
- }
复制代码 客户端代码:: z0 f6 ~% H0 S, E# A, c9 z( X$ l
- #include<winsock2.h>
9 D7 j: D1 T m" a - #include<stdio.h>9 k7 C4 m7 m: I) J* |7 p( x
- #pragma comment(lib, "ws2_32.lib")
7 P. t: K r/ V5 i( ^3 p: e - void main()+ S+ ]* {( r2 I6 I' p V+ [; h" |
- {
4 f- G9 |) n2 h4 r2 I - WSADATA wsaData;
, a3 F" `0 }+ I# g - SOCKET sockClient;//客户端Socket7 ?6 z& \( k/ t; l
- SOCKADDR_IN addrServer;//服务端地址
( n$ d e( C1 S - WSAStartup(MAKEWORD(2, 2), &wsaData);
) W) [- y. s; M' ~- H/ [4 o$ h - char message[20] = "HelloSocket!";
9 b# C5 i% o8 R - //定义要连接的服务端地址
9 w% L6 f3 @9 X1 } - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
/ y$ P. c* o2 ?* B ^: r5 E - addrServer.sin_family = AF_INET;& Q4 g1 e, J* \+ ]- q9 _
- addrServer.sin_port = htons(6000);//连接端口60009 I- R Q4 Q) r0 w& P8 K' ]
- //新建客户端socket
! M8 c5 v* O# g- m/ V0 ], C9 N - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);$ d8 j2 U$ h; `, @& d
- int s = 0;) ]( O3 Z3 S9 |7 B
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 n* L) ^$ I, J) o- ^% W
; r. Q, A% K: O- l% j7 c- while (1){
L/ J" N6 y4 b3 ^2 K - //发送数据
3 c$ G/ P& I) O* | - int a = send(sockClient, message, strlen(message) + 1, 0);* @7 w6 M s% I
- printf("to server:");+ W `1 S+ W; ?! U7 x# e
- scanf("%s", message);7 |& o3 b* @1 q; [* t
- 1 `) {; f1 Y; o8 ], G+ D
- }1 Q' f8 M& Q: O
- //关闭socket8 g6 ~! E+ D9 l
- closesocket(sockClient);
( C# y. L2 E4 \# s0 {, W - WSACleanup();
' t7 ~& E8 N y7 L5 R2 v! n' r - }
复制代码 求懂的高手来解答一下。
7 {: x( a7 M t! R' V谢谢了!8 |* }' r6 N8 s5 v
$ Z$ @- A9 W3 K( F0 t
8 z9 ?0 Y" N9 P: s
. D6 g5 i: L, a0 w* y. a) S; W6 k |