大家好,感谢你的回复。
e- V @% ]) Q, p% E$ z1 u我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 `( u! R0 z! N5 M
Talk is cheak , show me the code.* ~$ D( G5 N# T( B) A F$ C
服务端代码:1 r i$ d, F4 j% j
- #include<stdlib.h>3 a# O6 a* B- e$ X, E7 |! E
- #include<WinSock2.h>7 f! W/ x, M, \4 a$ M
- #pragma comment(lib,"ws2_32.lib")
" p+ t* G" D) y6 |) o - int main(){
: y1 s+ [6 x- m0 P! p* s - WSADATA wsd;
9 Q1 o/ |8 ]/ j" f+ [ - SOCKET sockServer;+ G' r1 x6 N$ W# x
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号$ z! s N: U' F- u* U
- SOCKET sockClient;
" }0 a7 p9 A6 U* G+ } - SOCKADDR_IN clientaddr;6 W$ ]3 e) M$ D% R0 j
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
6 T# Q2 R3 j# W2 L& i6 h. I - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
2 s9 h6 q: ], ` o' s2 @
0 D1 L7 T4 H, m9 G& L1 i5 w
5 T1 t( `7 H4 Z3 P% u1 H1 ~+ o. K- if (sockServer != -1 && sockServer != INVALID_SOCKET){
- h/ D7 ]1 `1 q) ~3 i' p - printf("Socket has been created :%d", sockServer);
0 p' a6 v. w ^/ ~ - }% [ e$ z- X. p3 R3 o
- else{
" O6 x1 I h' R: n* D4 }$ F - printf("Socket create failed.");4 U( ^2 m' U/ x w0 J1 @
- exit(0); v$ K N( ^! n5 U( s7 r6 R
- }2 ]4 [0 n. M, C5 {" @' E
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
0 O/ y+ g# e8 n) e6 y. g - serveraddr.sin_family = AF_INET;
/ i L8 R! j% M. a6 M( k - serveraddr.sin_port = htons(6000);//绑定端口6000
5 t- _: n/ v1 v0 W2 T - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));8 @$ `/ Y' P0 I3 z' a
- char recvBuf[100];8 K- H y/ ]6 \- A: M
- int len = sizeof(SOCKADDR);- z* u6 i7 P9 Y2 E4 B
- listen(sockServer, 5);//5为等待连接数* j9 ~9 g- Q6 a/ I" g
- while (1){( I5 X8 Y) c1 _' k
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
1 ~% Z0 h+ r c- W3 `* A - //接收客户端数据
% j4 A+ m1 }0 H5 R3 b - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);: c) {0 a: s3 `7 w
- printf("to me:%s\n",recvBuf);2 ^7 ?6 r( S& g8 l1 N; ]
- memset(recvBuf, 0, 100);9 F* g1 G( R, n3 I/ F5 X
- }
) ]/ G, G6 j" |$ k! \1 C8 } - closesocket(sockClient);
! s6 ]3 q- a9 E - system("pause");6 ]. {& r- I$ h! R7 L5 W6 W R
- return 0;5 f* Y K. |4 B( N3 N" m& S( M
- }
复制代码 客户端代码:
! v# A T, J @) Q5 j- #include<winsock2.h>" c# I6 F9 y* ]$ r+ G% S
- #include<stdio.h>
; o& J+ j7 u8 f4 W1 {4 [0 V3 } - #pragma comment(lib, "ws2_32.lib")
1 f. F$ B$ L" R+ M( {6 \ - void main()- K; t! i. Y, F1 O$ ~6 v
- {( h8 S/ |4 \; u7 [: {
- WSADATA wsaData;4 v) z9 c) x8 w
- SOCKET sockClient;//客户端Socket
1 l) l" |. t" |0 p8 G) L - SOCKADDR_IN addrServer;//服务端地址" o8 g9 d; ^5 }9 z% Z
- WSAStartup(MAKEWORD(2, 2), &wsaData);
0 r& {' \6 `! M6 } M - char message[20] = "HelloSocket!";5 R0 E7 J$ h1 i& s% S( \
- //定义要连接的服务端地址8 e) N1 `& [$ W8 }+ _
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址): d* |* h+ Z, p4 y/ L
- addrServer.sin_family = AF_INET;
2 S) \2 f( q; u! ~7 @ - addrServer.sin_port = htons(6000);//连接端口6000
8 U% {; X, ]4 k - //新建客户端socket
1 L) |- I9 B; E. T5 e: T, f& k( N, a - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- w U& G$ O# v: W - int s = 0;2 O p# j2 N" Y G- u) X
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: l0 _) z8 {; z
- ) P( }9 ?' B( ]0 p3 C( f# c
- while (1){
+ A$ `5 M# D+ [( \0 P$ j4 l( D Y5 Z - //发送数据2 Q" f' S1 P0 h3 ?
- int a = send(sockClient, message, strlen(message) + 1, 0);& y2 A: R) h" W9 L; ~; g4 L
- printf("to server:");
) O7 b+ o2 J M7 W' R. J' G0 B* r - scanf("%s", message);
0 y$ G( `# ~9 F3 Y6 m3 p
0 Q/ M. x( F( t6 q; r: }) V- }, ^7 z7 Y- Z) ?7 p8 b
- //关闭socket
; u; g0 m/ b% t" y% X - closesocket(sockClient);
, }; T6 \3 a' W# m) h$ z# _ - WSACleanup();% R, F6 e' C7 m+ B4 |
- }
复制代码 求懂的高手来解答一下。! H" j- s' a C/ D A C
谢谢了!* \6 a" C% y/ L1 A; H
& U5 T- C- O& q+ z, Q; y# G& T; _0 X
- o8 A% S* _" B+ ~* E
+ Z) c, m! c! ~1 i$ A
|