管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。% Q: N; z8 M& P4 J2 d2 s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, s3 g( G: I! {Talk is cheak , show me the code.' q1 w6 T! h U
服务端代码:4 t8 D/ G+ U. [1 D. x! X' ?; D
- #include<stdlib.h>4 ]& v! I3 Y% T' u
- #include<WinSock2.h>0 t) C- d! w2 m, k1 x6 J
- #pragma comment(lib,"ws2_32.lib")% c! u t' Q! }# g2 I
- int main(){' q& Z8 d. D" y" ~3 ?, Q7 h4 @( b
- WSADATA wsd;! v" r {; H9 l( d4 t1 G+ a
- SOCKET sockServer;1 @/ G9 j9 T( f$ [
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号5 `* i3 }0 k9 j5 o8 l7 `7 g
- SOCKET sockClient;
7 J" K) r. q& z0 h! `& W5 U X - SOCKADDR_IN clientaddr;0 V e3 A a, I% Q* P, L0 c
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口/ T. i6 `) [" n/ f- n0 o
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
& ?' b2 B0 U" B( y/ m
, D- A/ x/ t: {8 t1 g7 |: A$ a
9 w6 `4 o1 ?, B g5 S, h- if (sockServer != -1 && sockServer != INVALID_SOCKET){" e- B) g+ m) K2 I; J& e7 T
- printf("Socket has been created :%d", sockServer);- u; b% F5 O6 P- v: N' X/ N
- }3 a6 v" I" E. m! u n
- else{
' L& }( V% N* q8 Z - printf("Socket create failed.");
. ^0 N+ G4 ~, V8 p) R; i ~, b; G - exit(0);
: F7 |- Q. D/ T1 Y* t m3 d# S5 _ - }
6 h6 H3 s5 T3 N) D ` - serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
3 S: t1 B, l" B" x R3 v2 j# ] - serveraddr.sin_family = AF_INET;3 D( Y0 T! n- @
- serveraddr.sin_port = htons(6000);//绑定端口60006 i2 l0 E k$ p+ g# I
- int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
) I# `/ T v) u - char recvBuf[100];
+ t+ o! T5 v: p3 j8 ?+ [ - int len = sizeof(SOCKADDR); c) P& b9 a4 ]0 Z) g3 ^
- listen(sockServer, 5);//5为等待连接数, e: X2 a# x; `
- while (1){
) L( _1 D+ {& R w - sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
1 V( ~) m0 ?# D4 y+ p - //接收客户端数据
I8 x# J8 i( s/ |* a0 I4 P# ~0 ]1 z - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
6 y; @; f) X& g% S; D - printf("to me:%s\n",recvBuf);
' r- s- t( I: e# c: Y, C - memset(recvBuf, 0, 100);( m; J% U$ |9 p9 r
- }$ Z; k7 l2 B1 h5 B0 ?$ }
- closesocket(sockClient);
( r2 L7 J2 N( Q( [( ~ - system("pause");4 A, r8 g8 K5 {/ Z6 D( G
- return 0;
4 o ? v4 w- n3 j9 t& ~+ S - }
复制代码 客户端代码:
0 N6 a, H* W4 k: I- #include<winsock2.h>
@. u6 j7 E" q$ f; u - #include<stdio.h>& g7 w7 \9 W/ I* D- N8 i
- #pragma comment(lib, "ws2_32.lib")4 Z x1 U) J6 S
- void main()2 _' X& Y3 ?/ j, P& y+ ]
- {$ Z4 {5 O& h$ f6 U
- WSADATA wsaData;- R$ O' u2 f5 a0 T- z
- SOCKET sockClient;//客户端Socket+ y1 S$ R6 [3 M9 p! S
- SOCKADDR_IN addrServer;//服务端地址
, {- T9 J Y% r - WSAStartup(MAKEWORD(2, 2), &wsaData);( A- ?" l4 ~! O% m# v
- char message[20] = "HelloSocket!";
2 O% d3 t5 i# M2 T$ P. E5 P - //定义要连接的服务端地址, w- `' L/ ^ O# e: Q5 k
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
$ H: d7 n+ ?& r$ @ - addrServer.sin_family = AF_INET;
: j! o. V- p, C# b/ z - addrServer.sin_port = htons(6000);//连接端口6000$ Z3 V/ E: s/ k- T% o
- //新建客户端socket
2 p0 g% c& O. D - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
" {8 d/ R8 s) c6 `' ~: @5 S8 `% B% I. d/ T - int s = 0;
) s v* b' t6 @/ F' E2 d/ K. R - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));6 e. I, W" D! e; H6 h
- ; W3 ]8 g" ~* D! S# A9 N1 I
- while (1){0 S" Y- F( \. F1 z; Q: j
- //发送数据6 }+ b% P9 R& N
- int a = send(sockClient, message, strlen(message) + 1, 0);# H# X, }$ s+ S& `; ]3 {6 }0 ` w* E
- printf("to server:");7 F5 @/ ?" q$ j4 B* v$ }
- scanf("%s", message);& w8 I' z0 ^ Q7 x0 f; X' L9 k
- . c3 `5 t( F# ]$ v2 q, E
- }
0 \, {4 f# q: U9 t2 { j! ^. A - //关闭socket
4 o/ C: y2 T: \& Q+ l2 L+ U8 w9 w - closesocket(sockClient);
# K( T& ? i3 ]/ y2 S* q - WSACleanup();# u- i8 M7 ]4 V
- }
复制代码 求懂的高手来解答一下。
6 V4 C4 l3 _( j- ?# r, G% D- `谢谢了!
8 {1 g* A6 n* p( J, Q4 w
7 _+ w% D ?; h$ o! c
9 s, M1 ]0 ^" L# m+ `
/ C0 X( u+ D; U8 O! w |
|