管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。6 ~* }$ M) }& s. l3 o7 `
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
2 U" c# ?- W& }9 i6 H8 ` ?/ ~: qTalk is cheak , show me the code./ `/ D2 ?1 `" M
服务端代码:% \) t9 J( r1 _" u7 T
- #include<stdlib.h>
) x# f: i0 y, K3 x2 F% R [ - #include<WinSock2.h># }, O" I" b1 Y, I: R7 \
- #pragma comment(lib,"ws2_32.lib")
& s5 E" R( q& r' U( y1 { - int main(){) `9 W+ v$ q( j8 j' ^
- WSADATA wsd;0 h" J5 |+ s0 Q/ w- r
- SOCKET sockServer;
3 y, m: q) f; g- C* O - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
1 ?6 f$ k8 m7 c - SOCKET sockClient;
4 L! h! [% X% G% S! n - SOCKADDR_IN clientaddr;
' W9 k2 S r! j5 U - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
9 c/ h4 R, T" b# c+ y - sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
" Y1 v5 M9 O" x4 [5 F
2 C- @. S- Z e8 Z6 e* K1 L% b
# m u8 l/ p% D. ?; a, j5 c X* P6 l- if (sockServer != -1 && sockServer != INVALID_SOCKET){
+ M; |1 d4 L' E d% l' J# B - printf("Socket has been created :%d", sockServer);
, }, Q; T$ @) K" f% l+ b - }
% V5 ~, ?* p5 ~* Y1 P8 k7 o - else{1 }) F9 H6 ^+ e1 o" n2 q% W8 ]
- printf("Socket create failed.");3 \2 m3 e; d! s1 i/ Q, d
- exit(0);
/ j7 s9 u5 E- f* U; i - }* k! U/ M1 q2 A2 Y( L0 ?& }
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);: U3 A- ]% L3 v U5 q
- serveraddr.sin_family = AF_INET;# [" @ o) n! J1 H# j
- serveraddr.sin_port = htons(6000);//绑定端口6000
8 }) N8 v" z3 z% c" o" T/ y* a" F - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
0 ^" F) y7 P, `2 m/ G; n) h - char recvBuf[100];
. ?+ G8 a8 g3 Y$ p/ X - int len = sizeof(SOCKADDR);: U6 k' R" R! `, o+ w
- listen(sockServer, 5);//5为等待连接数
0 s+ h% k* I6 h j& \ - while (1){" v& J# C* E# I7 }& z4 U: y& P
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);0 ]: X5 I3 u% J5 I
- //接收客户端数据6 N- C: ~* I7 s
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& T+ M0 R' [. D S - printf("to me:%s\n",recvBuf);" E2 W7 B& b8 d! w: F8 X
- memset(recvBuf, 0, 100);8 t( a" N3 L* Z9 D. n& }: d; x
- }% N0 |3 B& S. B- `
- closesocket(sockClient);
6 p* d4 d. |7 X! W - system("pause");! L) Y0 q+ x- S9 o8 M L" t1 m3 I
- return 0;
2 s, i% n. _" ]& k) a' H - }
复制代码 客户端代码:4 Z+ L! U* `1 v/ Z
- #include<winsock2.h>' ]6 m; d( _6 p' h; q+ n
- #include<stdio.h>6 y) C. s# L1 g7 V. x4 g H% f
- #pragma comment(lib, "ws2_32.lib")
8 f0 G+ S) A: \3 n - void main(), P' K. O, o7 O+ O
- {4 N B' r% I6 i- l' S0 ?
- WSADATA wsaData;
' c" o1 g& o8 T- a# `; J+ T+ D+ ] - SOCKET sockClient;//客户端Socket
" B! h4 m, B$ C) h" b! k7 e# v# D% G - SOCKADDR_IN addrServer;//服务端地址
' K. @+ G7 B/ u, e- c+ x+ k: x - WSAStartup(MAKEWORD(2, 2), &wsaData);% p. Q; X: ?" \6 e& K- l
- char message[20] = "HelloSocket!";
1 ^( ?3 z4 L: x' \ - //定义要连接的服务端地址$ v6 [+ |6 L( j8 \" V4 u, {+ O" K
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址); R9 C% b. {& W$ T1 b% t
- addrServer.sin_family = AF_INET;
2 s$ ]3 i4 i/ q - addrServer.sin_port = htons(6000);//连接端口6000
7 B4 q( Z9 O- |0 a( } - //新建客户端socket; |2 E, |6 |3 S) \5 K3 f2 N3 v3 Y
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
4 p/ {. A+ `- m9 c6 H2 u - int s = 0;
3 D3 J0 W0 ?. f2 n! I: F - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));- N0 Z- K/ j A$ {
# L) Y$ F9 x8 i& {+ @* D- while (1){& M8 X# G% h: R6 g& d5 [; s* T
- //发送数据1 ^* [/ M* Z" v) x5 s
- int a = send(sockClient, message, strlen(message) + 1, 0); I0 J. f8 H; t1 R1 P2 l
- printf("to server:");+ l) ^4 ~* p! P
- scanf("%s", message);/ r0 Y6 P, y: {2 {: a
2 R3 F) n# H1 C# F; D7 }- }
, D# X. |# U( n. r3 c - //关闭socket
7 i/ \3 [5 R) A' {: k g - closesocket(sockClient);5 C T0 y y- ^
- WSACleanup();
# N/ b1 {9 H( t! ~1 \+ J - }
复制代码 求懂的高手来解答一下。
# b4 h8 S" [% g& r, b% O5 s: q" {谢谢了!7 i' d. Q$ U( m- z
6 M3 C9 ~$ f$ x( m3 w6 f+ d
6 S+ q6 B) P& Y6 L( R# m
& \' n+ Y( Y Y. ] |
|