管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
8 D% C* ^. j0 s4 i6 G, \* Z我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。/ V# K- ]7 n& ] S0 f
Talk is cheak , show me the code.
. V2 ]; y! p- a/ [服务端代码:
" y4 T. @" s4 S! s9 H- #include<stdlib.h>
2 v) f1 A# L- F' V) O g - #include<WinSock2.h>
+ N5 N, H8 W1 b/ o. P - #pragma comment(lib,"ws2_32.lib")
- f3 e4 P1 V9 A7 u% g3 Z" x% @ - int main(){
f3 }: L. o2 S$ A1 F5 e: r - WSADATA wsd;
}; S; F1 y4 v- }" i - SOCKET sockServer;
! t! r: U3 y* u7 E - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号3 A- \. C: X5 L& ^8 T) C
- SOCKET sockClient; _" l- j" z* Y6 m$ E# S1 t
- SOCKADDR_IN clientaddr;
; |7 l( Q# h' c* W/ z - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
: G! u) [# V) m9 w - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
9 L h+ |0 @7 C0 _+ ] - 0 v/ r( ?4 X) }" Q6 V' U
2 ]8 Z8 {* _1 @8 q' e- if (sockServer != -1 && sockServer != INVALID_SOCKET){. g9 l4 C! a, S3 E8 v* j
- printf("Socket has been created :%d", sockServer);
} U E9 S r( m5 Q# M - }( a; n9 W- D' M: O
- else{7 C$ l8 b& G2 b% B t8 y
- printf("Socket create failed.");$ t B9 A- ]* Q b* a
- exit(0);* T a* f- f2 q8 g
- }+ B9 q6 e' w1 U8 L; `: @. S& `
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);0 m4 ^6 o1 i7 D
- serveraddr.sin_family = AF_INET;
3 c. C/ ?3 l" p3 A- w0 C - serveraddr.sin_port = htons(6000);//绑定端口6000. Y4 ?, X2 x6 j! a; C E/ A
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));. u/ Z) ]9 Y- L" f: I
- char recvBuf[100];' o8 e: k5 D% i2 N1 h1 o: `) Z
- int len = sizeof(SOCKADDR);
) U3 g+ k+ m# P1 S7 q - listen(sockServer, 5);//5为等待连接数
, W3 T* [: e! W( X, D: \5 F - while (1){" F. G3 P K) y. q- K. K
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
' M" N$ M0 A8 |+ L2 x0 U - //接收客户端数据
2 B5 W+ Q, m8 K" f4 }3 ?& f) u - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);- ?; V' S1 O5 Y3 }, H3 Q/ p
- printf("to me:%s\n",recvBuf);
) d# @6 b5 v" Y5 m - memset(recvBuf, 0, 100);! j1 H! V8 ~1 q- E; ~9 ~
- }# u- H7 r* c" g& Z8 G5 b
- closesocket(sockClient);
' n; A$ R% G( q& f - system("pause");
! U9 _" v3 k0 F$ q, G: T/ }2 t5 H - return 0;4 ?, W6 w' i, E7 s( h
- }
复制代码 客户端代码:3 p+ [& v! r# V2 M/ z
- #include<winsock2.h>: F" q/ _' G2 v$ T
- #include<stdio.h>
" l$ N' S* e5 E; t - #pragma comment(lib, "ws2_32.lib")
- D. C X6 m" T% W/ i - void main()
* d2 B" O+ _1 e( \( Z% L - {% H4 y: Z+ j: H$ O: H; L
- WSADATA wsaData;" w$ b* M: g! i V1 R# d
- SOCKET sockClient;//客户端Socket( p5 E" B0 ~) E$ z3 c) }+ T. F
- SOCKADDR_IN addrServer;//服务端地址
: U# ]& j; T8 Q* ?, f) F! ` - WSAStartup(MAKEWORD(2, 2), &wsaData);$ ^8 I; U E# l* R; ]/ q9 R
- char message[20] = "HelloSocket!";
X6 ?" R* [8 Z: e2 K8 \. {) m - //定义要连接的服务端地址
% [7 c! ]" @5 X \8 l - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)5 b: U5 w& z4 d( Y
- addrServer.sin_family = AF_INET;
0 v0 W7 e3 h2 z2 J- x# h - addrServer.sin_port = htons(6000);//连接端口6000
. n- G' |( o" n; f( k+ K) i - //新建客户端socket
0 y3 g+ X2 i- P# R% ]1 ~ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
# J" U# b+ Z& P9 j- i - int s = 0;0 @, U* V! m g/ n$ ~
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
; R, O: G) t H8 w5 Q
; p3 C/ W; c& j- while (1){ N' V' S I! ~! O5 x
- //发送数据6 [& g2 V( C/ ^% a- ~
- int a = send(sockClient, message, strlen(message) + 1, 0);0 l( T4 g4 ]4 {" K
- printf("to server:");
+ k8 D; q7 h& @" w2 a/ W* V: t - scanf("%s", message);, t2 U7 @" a0 F' z" X3 R
: H1 w- L) }# d/ @! `- }- o2 Z7 {* J$ D
- //关闭socket
?4 D! g2 `/ V; X* H, ~ - closesocket(sockClient);
" o8 R2 g. P9 ~1 u8 B3 `1 r0 ] - WSACleanup();
/ c. R1 r8 g ?, A- [; [ - }
复制代码 求懂的高手来解答一下。
. v2 W, _2 s& I& A' w* X& a谢谢了!
/ h# I& ~2 E9 ]' _# K( |3 X. {7 D1 Q* g+ b9 m
7 Y8 L0 J4 n% Z
6 l; V9 n2 {- h2 D. T& R! X% _% c |
|