管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
大家好,感谢你的回复。; |& n+ n! |4 i' ?+ p% v
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 @% ]7 z$ {( g+ g* g! WTalk is cheak , show me the code.
7 L$ x }+ W' e6 ^0 g* \0 d5 [" F( V% _服务端代码:
k* x. p* [$ e% G: b; [3 N: J/ v- #include<stdlib.h>4 } n; P4 s5 i4 X4 b/ E6 D
- #include<WinSock2.h>0 ]) z1 D+ r! d+ e0 Y
- #pragma comment(lib,"ws2_32.lib")
( O+ r" [# \( w! S5 y9 i - int main(){& }! b0 Y7 y) ?3 j( t" v$ W
- WSADATA wsd;
1 H( C; v k" Q6 j# \ - SOCKET sockServer;
- _ l( X" _& x - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
1 b7 s }; O# c) y, ], t - SOCKET sockClient;2 z# M2 g; v3 h# c! o" c$ S
- SOCKADDR_IN clientaddr;3 g1 y" p( ^1 h$ ]+ [
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口$ x& I- d! b6 A% _2 d
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
7 _3 v$ \/ J' P5 H; q7 S1 _ - ( K5 F2 l$ \- Q4 V- f5 y7 f1 q( S
& {: j) D$ _2 h7 H& a7 w, v) R- if (sockServer != -1 && sockServer != INVALID_SOCKET){
) Q% x* g4 ~ Z+ K# M- q n0 _ - printf("Socket has been created :%d", sockServer);5 o: h$ ?$ ]) }! }3 Q V0 e- P
- }
8 a8 p$ ]! X# C - else{" S5 V- J0 c# H/ U' Z# T
- printf("Socket create failed.");
3 e [8 I* r* V: Q# g3 G l - exit(0);# o+ o* H7 e: _ b% g6 G
- }: H# ` o+ O7 i5 b4 V
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; R L( A, e* }' m+ [
- serveraddr.sin_family = AF_INET;' v% B9 W/ e& F) X- c) k3 q7 \
- serveraddr.sin_port = htons(6000);//绑定端口6000
, q1 j' w* d% F0 i8 P/ G - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
) f" G8 G' ?9 E - char recvBuf[100];
: k9 n) i% e% c8 ~) C6 \ - int len = sizeof(SOCKADDR);2 F2 E$ U! V% q1 g; Y
- listen(sockServer, 5);//5为等待连接数; G- `. U6 I% o6 `
- while (1){: a6 X( Q% w3 z- @
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);* }6 p0 Z8 O7 `' y$ u9 t5 } C
- //接收客户端数据6 p( l; _) w1 ^- r
- recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. m5 ^5 X( c, P
- printf("to me:%s\n",recvBuf);
- R5 y& ~8 k+ H/ z - memset(recvBuf, 0, 100);
6 b4 `/ N' y9 @. c3 {* K - }
' `5 Q1 K2 f) k( m. {$ i0 T9 i - closesocket(sockClient);
0 H( }% J/ R6 h, L7 y0 G - system("pause");9 d! ]; T0 ]1 T9 _+ x* M; F
- return 0;
" D+ N9 ?- ~" n6 v5 b$ @ - }
复制代码 客户端代码:
& G1 ~: d. y4 V( A( X- #include<winsock2.h>0 G- J3 O8 b7 s( x
- #include<stdio.h>
7 S2 v& U7 I$ n2 n+ Y8 t - #pragma comment(lib, "ws2_32.lib"), q4 H0 H b" i; g1 o q u5 X
- void main()
. i" p1 \0 Y8 A9 `' o% }. h a - {" m* X1 K* j+ [$ L9 B3 C( b
- WSADATA wsaData;
2 k, h9 u6 j" z. n$ h$ _ - SOCKET sockClient;//客户端Socket: Q% v. Z' h# t; @2 |% l& _8 ^5 Z
- SOCKADDR_IN addrServer;//服务端地址5 E# ~/ c3 @8 M: Z9 V9 f
- WSAStartup(MAKEWORD(2, 2), &wsaData);! `- ]; a- l j9 _* |+ G
- char message[20] = "HelloSocket!";
3 U" o7 x0 r2 z - //定义要连接的服务端地址
7 v- |. ?) ]& X - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)& l4 p1 {* S' ^9 y( l$ A
- addrServer.sin_family = AF_INET;
# T9 `9 @" b4 l: z: D - addrServer.sin_port = htons(6000);//连接端口6000+ L* Q) E# r4 X$ R v) h
- //新建客户端socket
* m% I C( t% x5 _ - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
% H4 } t( }; U4 p# a2 G7 ^8 E - int s = 0;/ I! T9 i8 u _% m' S R# h
- s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
# P! C( E( M- T" E+ @ - / ]& C3 U& w& q9 q, c
- while (1){$ o; O& b/ G* ]9 `' s e
- //发送数据9 C' h; Q& _ X& R" i
- int a = send(sockClient, message, strlen(message) + 1, 0);
9 b4 u' v z0 p! \6 U2 T4 Y% A6 Q - printf("to server:");8 m8 ~5 A: M e" `: o
- scanf("%s", message);
' O/ O7 G7 T, [* g/ M) h
' B% i$ F- y9 x# u M" I6 t- }4 Q' g1 t" [+ D6 G+ \3 E/ C
- //关闭socket
/ _" q! t d/ K! l& k# X( f7 K: p - closesocket(sockClient);
/ \: z8 Q8 |, g# e+ r - WSACleanup();. C8 E% }9 d C4 ]) H
- }
复制代码 求懂的高手来解答一下。. G7 q/ Q1 ^0 O
谢谢了!
" ?7 U: M: B6 ~- x" l' b2 }3 \6 Y* O$ c5 }" D. G2 _, k) g8 G
7 _; {- B8 F3 R, ? w( v9 c
6 r( W% @; {1 ~( _ |
|