大家好,感谢你的回复。
V( O' j: W& F6 C我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。# y. N, R# g5 j v
Talk is cheak , show me the code.
, n- @6 R3 i! O7 ~/ t+ N服务端代码:
, e9 N' n3 ?# z3 _- #include<stdlib.h>, b/ `0 L% F* x& g' J* i
- #include<WinSock2.h>
/ N# ?( s: G' Z# X' b - #pragma comment(lib,"ws2_32.lib")8 `7 F1 e4 e4 U8 |+ b! C6 A3 i; d
- int main(){! i2 p* B" R( a0 h, r
- WSADATA wsd;
* O) D+ Y* e5 ~( p, Z - SOCKET sockServer;6 c7 G# P _. I
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号# w/ e! ?; _- X( H0 L
- SOCKET sockClient;
7 u, I6 s* R! Q/ A6 J - SOCKADDR_IN clientaddr;
$ l/ ^4 P/ S3 \4 S+ m6 q - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
$ N, R' N8 O( P0 H, ] - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 {8 j! V, m$ a2 I, U
- 7 u, S, k( x9 [# w& s
- 7 B) ~( g6 q T* N& d' E: S; h
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
- ^& \; u8 T& t: v - printf("Socket has been created :%d", sockServer);$ m$ l. C" p+ p$ W% c/ Z' ~
- }2 N0 K4 N+ a9 Y* P1 ]8 s2 n9 J
- else{
+ ?1 [3 F! }- I- R6 b/ k9 r5 y - printf("Socket create failed."); z. J5 B. e. y& t6 G9 f4 o; p
- exit(0);8 O5 t* k- F: I
- }: w5 z% b0 ?4 Z5 S
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
8 @' E+ T9 b' B - serveraddr.sin_family = AF_INET;1 N' x" Z0 W3 A% O8 z
- serveraddr.sin_port = htons(6000);//绑定端口6000
( U! r6 s, o' e& X: u* q* j - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
* b. d/ A- {$ p6 d+ S - char recvBuf[100];
' r. T* p. f/ Y$ O - int len = sizeof(SOCKADDR);) \, |0 O+ @% t, ?8 a& d( K# r
- listen(sockServer, 5);//5为等待连接数
1 n$ s U& [& K3 f; Y6 f/ U; k) [ - while (1){& y. t' d ~( Q4 B" T1 v
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
: m9 i/ \4 F' [ - //接收客户端数据# B# S, P. z- W
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);% U6 k. f- H( T* L* d% s. \. j
- printf("to me:%s\n",recvBuf);% V4 w4 U2 E. @! a) B7 H0 d6 G
- memset(recvBuf, 0, 100);
! }: j! n' [9 f - }
$ `+ \- Y1 C' k - closesocket(sockClient);; O, @- S, z- Z; _; F- ` G
- system("pause");
# ?% _- s) a& ^8 W - return 0;
) O& Z" ?8 U) v; P" ~! F, ]$ w& n - }
复制代码 客户端代码:
) q- h' h, `+ Y+ }6 X: p2 f# J- #include<winsock2.h>
& `# y6 j& U1 l$ B - #include<stdio.h>
9 S7 N/ w" j* h$ } - #pragma comment(lib, "ws2_32.lib")
8 j% w) R; S' C! [2 w - void main()
$ C+ m8 B3 E5 h! ]' N - {
$ y( x1 \/ h/ Q2 Q, o - WSADATA wsaData;
7 g" j, `" R& P - SOCKET sockClient;//客户端Socket
! c. G* w- C7 s/ M$ M ?$ ] - SOCKADDR_IN addrServer;//服务端地址
% a' ? f- v- J( i - WSAStartup(MAKEWORD(2, 2), &wsaData);. h0 V7 l9 D) k% s" P
- char message[20] = "HelloSocket!";
' ~/ |! B* B! d1 p - //定义要连接的服务端地址
m9 ~( I, |$ {3 p. b - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
% D$ W6 j4 ^; X, Y A% I9 h - addrServer.sin_family = AF_INET;
) X7 W- y0 r' ?7 g- q: }* H0 t - addrServer.sin_port = htons(6000);//连接端口6000
( o5 b2 J' o$ J) _ - //新建客户端socket' m- a6 x8 b) p, c- n4 k- M
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);* I D7 I3 e" j* s
- int s = 0;3 Y9 b1 r1 m+ {
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));: X) @1 B# M0 Y* l9 g
/ M+ x( `* r1 Q' Y1 p. M1 a- while (1){
4 k- q S- d+ m+ q. ^3 O, r - //发送数据
) s. l. \$ z0 t( P7 G! x - int a = send(sockClient, message, strlen(message) + 1, 0);0 }2 G- a ?5 @3 t. J% U
- printf("to server:");
- @( F4 T& {5 Q K/ P9 h - scanf("%s", message);- I3 N) e) D$ _
2 m+ _/ N6 g' d( O- }
9 j: L3 |) g/ c$ G$ P4 y0 z - //关闭socket+ N8 B1 ^( }, c! s( K1 |
- closesocket(sockClient);
8 Y: v4 H5 u* \6 V* f1 D4 b - WSACleanup();; e# }) a2 t5 \
- }
复制代码 求懂的高手来解答一下。7 `2 A* n1 [4 x. g! L! d$ g
谢谢了!( V( N- z% l: Q: D+ P2 q, b
) S: L3 |4 a3 b! n R! j0 W S' g5 ]& |9 c
# [( N4 o5 r2 \% u$ i) d
|
|