管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。
4 U+ D- j* [( r L% B我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
& ]4 q% O; y, r* T4 H; C& mTalk is cheak , show me the code.
8 U# d' w, y: m! r7 U服务端代码:
, z, F0 \. r3 f+ o9 E& v- #include<stdlib.h>; p; E7 C7 x3 y* b% d- K
- #include<WinSock2.h>
% t. \( h( d- B7 a! { - #pragma comment(lib,"ws2_32.lib")8 f2 H# ?; ~: j& w4 H
- int main(){
3 \ A( r6 V9 q( r# b" S - WSADATA wsd;5 ^1 D3 O0 r p; G% m) |. l
- SOCKET sockServer;/ V. G: ~: n& ?0 j
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
' N" o# I# d/ k, y2 I6 U! b - SOCKET sockClient;
% p/ B) @& j' D; x6 R* O, \9 A% ]5 S9 Q - SOCKADDR_IN clientaddr;4 \! o, K: R' p" j
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口5 W2 O$ G2 `5 Z8 q# g9 o
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 Z2 V M' O4 F5 k2 N
: ?/ _9 Z/ z% ]8 p$ K
6 o, V2 ?( n0 \+ q; {( p- if (sockServer != -1 && sockServer != INVALID_SOCKET){0 w. `* }2 ~' R$ G a) G' K
- printf("Socket has been created :%d", sockServer);
% u$ ~4 U5 D/ O- Z/ b0 g, \, l - }1 I. r, p, d. ^ a: G+ e
- else{
6 F1 o7 [& C7 Q' z! S6 d2 ]' Z9 y - printf("Socket create failed.");- i5 W! @3 J4 a
- exit(0);3 J! P0 K+ K: ]9 a8 x- E! t* Q, A
- }' n9 {# D$ c- c" V) i
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
: P3 O( M" p" h* |4 \0 f; ^0 x - serveraddr.sin_family = AF_INET;
. e2 ?) t( Y1 H" y+ s" H% k - serveraddr.sin_port = htons(6000);//绑定端口6000
/ {5 H7 h. c8 B% Q# W. s. T6 _0 H - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));' V& N! S8 I. N/ c, {. p- T$ M
- char recvBuf[100];) N2 P5 U, Z! }, ?/ e3 J" K. J# e; w
- int len = sizeof(SOCKADDR);
2 G# E, }: ?" S! S5 C - listen(sockServer, 5);//5为等待连接数( q% o+ H6 Q) H
- while (1){# k o! e- P" v; d- D
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
" \; e9 \) T% j+ @; i - //接收客户端数据
4 M- l9 { z3 M# e8 A: K, j - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);& X8 z/ @1 I0 J$ B
- printf("to me:%s\n",recvBuf);* G% m5 e) Y4 M0 ?0 E
- memset(recvBuf, 0, 100);
; U; ]: M4 f6 ` - }7 n* N7 I- }, q6 O U. x8 n+ s
- closesocket(sockClient);" ]# {) U8 P, m4 C9 g* s) u+ e, R
- system("pause");
7 u. g) j' V$ C" O# d6 L; g - return 0;5 u0 T, Z2 J8 Y% w
- }
复制代码 客户端代码:* }; ~3 }, a* M/ j. ?' s% v
- #include<winsock2.h>& _7 U J; D% Z& c4 q, g
- #include<stdio.h>0 r E% Z% ]4 t* n6 _. i2 C
- #pragma comment(lib, "ws2_32.lib")
( n) p4 I! c9 R) T X/ f+ b - void main()" F$ k u8 f6 ^% \3 i# ?) l/ D
- {1 Y7 \& ?! o$ J) {- p7 g& e* n
- WSADATA wsaData;
" P- m' C6 z! w1 h! T' @) K - SOCKET sockClient;//客户端Socket
% f B: A5 i3 K0 ~% p& M: i) a - SOCKADDR_IN addrServer;//服务端地址
8 n4 }& ?- q7 H - WSAStartup(MAKEWORD(2, 2), &wsaData);5 K6 v9 F5 ] A* p, Q
- char message[20] = "HelloSocket!";/ `2 W% z) r$ I4 u+ u+ K. u
- //定义要连接的服务端地址4 Q, {% n* `4 J! a3 G$ d
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
, |2 u* j' e1 d5 F% l; T8 L9 } - addrServer.sin_family = AF_INET;/ h7 ~! g& p/ N/ ~& Q2 S+ D0 x
- addrServer.sin_port = htons(6000);//连接端口6000
7 d2 X/ i- v* N5 p3 H - //新建客户端socket
6 b: i, t5 W/ r. _# p - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
8 j3 e- E4 i& { D4 [ u - int s = 0;
# z" O, F8 o' H- D - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));, A) d; N% e' y% O5 T2 A% t3 Y4 `, D
5 {6 R) Z% L. m z) Q3 y* C5 E- while (1){
* Q+ h! V7 p4 w s" c - //发送数据( t9 S! E, T( N6 ]% U R k' j
- int a = send(sockClient, message, strlen(message) + 1, 0);
! n3 n1 E* g: `7 i - printf("to server:");2 e. B1 j& a' M* R
- scanf("%s", message);( Q0 `% i5 u( g: |# Q
- S; `3 B$ v5 m$ C9 M! k; @$ A0 M Z
- }
- {5 E/ O/ E, X6 z# S - //关闭socket
7 H8 x7 V6 P! _- o t& k - closesocket(sockClient);
, @$ Q- S, r# c/ t/ @* O/ Z4 W; L - WSACleanup();% O h: O! f$ u% ~ V: T6 r
- }
复制代码 求懂的高手来解答一下。
6 S; ]7 L+ A4 v: K! {: ?谢谢了!- @8 y/ L. u$ d+ A$ O& L' G
9 S3 C$ V) x9 @' n! W
1 T$ e* u# U. T, q' y# I" W0 q& z! m6 m0 i6 N& H* `) E' J
|
|