管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。9 d& k3 D% F8 T ^* z
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。8 p% ?4 w; a) W @2 x
Talk is cheak , show me the code.6 R" ?! B, F4 a/ j1 o. O% r/ U
服务端代码:
' a; M7 w% f ?4 G, {' r) D- #include<stdlib.h>, }& ~/ H, K& a$ B) x$ v: |
- #include<WinSock2.h>9 V& m+ R" a4 U9 B: y2 r/ j7 T
- #pragma comment(lib,"ws2_32.lib")) t9 v8 C5 g* [2 a7 v4 L
- int main(){$ L6 c9 g, E q9 Q
- WSADATA wsd;
7 R) L6 G# R6 k6 x6 l J - SOCKET sockServer; i: Z! Y5 R* m8 k2 q9 U
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号$ g/ s, e3 T* A* i
- SOCKET sockClient; g! M2 G+ ^ ?8 o! K
- SOCKADDR_IN clientaddr;) o1 i: B/ t2 x- E" s
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口; F- ^% t7 Q: U4 @9 ?
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
( K$ t9 L- T9 u6 E- G' q* v
" G0 Q8 m" e( D; c5 x- 3 G( C" m# j# Q& O+ P3 B
- if (sockServer != -1 && sockServer != INVALID_SOCKET){
( b' v7 l$ j' D( l - printf("Socket has been created :%d", sockServer);' s5 h8 A( X" o: m7 v
- }/ @* o& u$ E0 X6 W
- else{
6 s: J X3 Y6 G, Z* V# @9 b! a7 { - printf("Socket create failed.");
: x/ ?3 M. x: Y6 s - exit(0);
: R/ ]2 F1 |8 L$ E4 M, A) I) Z; A7 E - }# `) U" J8 d8 S& {2 N( O
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
+ q8 ^4 X9 \ U5 g7 ` - serveraddr.sin_family = AF_INET;" y$ J7 f7 u" s/ Y4 A
- serveraddr.sin_port = htons(6000);//绑定端口6000 ]/ X. c( Q& w/ [
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));! K/ u1 ~8 S0 E9 Z S
- char recvBuf[100];
9 `: H( G: D, V3 K0 r8 F( h - int len = sizeof(SOCKADDR);0 j: |9 ^4 C0 T! x$ Z! x
- listen(sockServer, 5);//5为等待连接数
- @4 d9 j# s) y8 i' w2 @$ |% f1 u - while (1){- j2 L3 z9 v. O$ Z: A( s# a
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
; A& l, a( E, L0 |7 I9 u- _7 v - //接收客户端数据+ d5 e+ P9 d# w) ~
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
3 }' G8 a. Z# q4 j- c7 ?# A - printf("to me:%s\n",recvBuf);
5 W1 G2 o* X+ V w9 W* ? - memset(recvBuf, 0, 100);7 l& p( S, {; W( ~/ J1 X8 }, S
- }
" m& f. O& z: {9 p6 ` - closesocket(sockClient);
S1 F; Y* g# c% b, q& ?. T2 v5 R - system("pause");. ]3 y# `) ^! P( q* i* m
- return 0;
! E9 W' J! E9 } - }
复制代码 客户端代码:
. c3 h7 [" Y2 _& D; U/ f3 W- #include<winsock2.h>
7 q# } L* \% P. b - #include<stdio.h>
, M N- W/ C5 T! ?5 c3 u! A$ l - #pragma comment(lib, "ws2_32.lib"). V) b3 F' Q8 I! s
- void main()' M5 Q1 ]1 h4 _* o) M
- {. a% v: ]& a6 ~
- WSADATA wsaData;
" C H4 V* z( ~" X( |' s# V - SOCKET sockClient;//客户端Socket o! C W3 x9 I/ A W7 R" \
- SOCKADDR_IN addrServer;//服务端地址) S" f$ }2 S6 o5 \" @
- WSAStartup(MAKEWORD(2, 2), &wsaData);- |0 Q3 ~. B3 u& m6 r. @: ?7 Q
- char message[20] = "HelloSocket!";2 Y- e9 L/ z9 s( N3 _2 B
- //定义要连接的服务端地址4 ]# Z8 |. |% A, S6 P" O/ r, _5 X: J$ w
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)7 G R( g/ V3 z2 u$ R( R+ C
- addrServer.sin_family = AF_INET;
) E# `4 E, U- r. y# X - addrServer.sin_port = htons(6000);//连接端口6000
3 s& S' Y. q, r8 N. M% m - //新建客户端socket- H: d* k1 K+ q# I
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
* q& r0 Z6 o' c+ [# @+ M% O+ } - int s = 0;2 I! Y: f( {: V
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));0 s# _" l9 }3 x
- , u' H, l+ N! C% K; v5 G
- while (1){
9 o) C; ~; A( v5 P- b - //发送数据
9 Q* V. ^" o3 \' i4 b4 @; _ - int a = send(sockClient, message, strlen(message) + 1, 0);
1 F9 V8 _' q6 |; N - printf("to server:");, |& K1 Y. ?0 B* g- s0 i. R
- scanf("%s", message);
2 ^7 C' I4 Z. g7 J& X - 1 ~: t, p/ }2 v8 y& L8 D
- }1 J! G5 C' H& z. z" v7 a
- //关闭socket
2 {3 c* Z2 |& ?1 P4 {6 N: K - closesocket(sockClient);
) z0 [0 c& x$ j! W) F! l9 \ - WSACleanup();$ _, W' v0 i& T: s- I
- }
复制代码 求懂的高手来解答一下。
' w0 @7 h* [! G+ @4 s谢谢了!8 u3 g( I: D( N; y- Y* P
8 |- ]. z6 a" c+ J( j
, Y9 L' A4 l6 V: C1 W3 F' h; d, R8 h: W
|
|