大家好,感谢你的回复。
. @$ P" t) x- i8 H$ p/ S. X# S- E @3 H我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。7 p& q3 v$ D* Q2 @, t1 i
Talk is cheak , show me the code.* L, C1 v _, v) q7 w
服务端代码:' I Y0 y& m7 }) Z" a
- #include<stdlib.h>
1 K" [/ ~4 K y& ]0 ~& I6 d# J0 A - #include<WinSock2.h>
' m" N# [& w6 J4 e - #pragma comment(lib,"ws2_32.lib")
* _) I3 _, M) ?$ R - int main(){1 _% J* E; d& J" l
- WSADATA wsd;
- |( c/ @+ D1 H; a4 e - SOCKET sockServer;
/ K* ~9 N5 U3 C0 u3 I% P - SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号, l% e0 X/ f' H
- SOCKET sockClient;
% p$ ~; O9 m& Q- s - SOCKADDR_IN clientaddr;9 M% k- T6 H7 s$ q+ ~* K
- WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口0 d( N# X! M# |' s# k. N
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket+ x2 [; p) u, T2 `( ]: a
- 3 B1 R0 @; O0 M q8 {8 E
- 9 l' w9 ~% [, \; B0 c
- if (sockServer != -1 && sockServer != INVALID_SOCKET){& @( g* z: m) R* p% ` s/ m# f
- printf("Socket has been created :%d", sockServer);
9 Q$ }" W) E# X7 v: m$ J - }
9 s: H/ K2 ]/ Z, E- e - else{8 W% w4 v- W9 P8 A9 K' f; [
- printf("Socket create failed.");
6 v7 ~* s s9 w& A5 i - exit(0);
4 t( h- S# ?" m9 u& Z1 e0 v+ a - }; u- [3 ~. a6 a' n
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
0 E: Q4 Y- P" l - serveraddr.sin_family = AF_INET; w* j5 a( k9 ?
- serveraddr.sin_port = htons(6000);//绑定端口6000
. |( [! _ i& |4 o - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& Z5 {3 h/ L' A. c8 j" Z
- char recvBuf[100];, |& u. N9 x0 \* Z
- int len = sizeof(SOCKADDR);7 z; \: v4 T1 @
- listen(sockServer, 5);//5为等待连接数$ p7 }1 Z3 g+ C
- while (1){1 w I3 [3 t1 ^4 B' u+ D
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);3 r- ?! L. Y! ?5 ? H
- //接收客户端数据
* o1 M! h; B% d, d$ k" d) m0 `7 i' Z - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
/ l( [! D: ~2 w+ L - printf("to me:%s\n",recvBuf);
9 x& p( ?9 J# x3 o( n - memset(recvBuf, 0, 100);6 }; I1 S9 c- ~1 `8 j( L$ p4 D
- }0 C4 ~' C7 l5 |+ R9 G$ U& ^1 h
- closesocket(sockClient);
$ S9 l9 S* f( L' \& e2 L - system("pause");
5 R+ }2 e# L' j* [/ ~& S0 l - return 0;
) x9 H: P/ Q3 `( x; d4 A$ g - }
复制代码 客户端代码:! e! {3 v) y$ N/ K5 k, z6 {. N4 ]' v
- #include<winsock2.h>
+ K; B; v# t1 f5 i - #include<stdio.h>
0 f/ F% q! b$ e- J! _! D - #pragma comment(lib, "ws2_32.lib")
8 D0 M) ~! L& a. ~3 S* L3 C - void main()
. O8 ^9 x9 y8 r2 S6 |2 g+ M; z9 @ - {% ?4 b& j2 Q' L4 \% F
- WSADATA wsaData;* y [# U# P; x U( V6 j
- SOCKET sockClient;//客户端Socket
, l: I* o0 o3 d5 X* Q - SOCKADDR_IN addrServer;//服务端地址% a0 i: i: o2 M( ]- h
- WSAStartup(MAKEWORD(2, 2), &wsaData);& W# J$ u% b' G- Y
- char message[20] = "HelloSocket!";5 C+ a2 u; ]3 [
- //定义要连接的服务端地址! H- c( V, z$ ?0 b8 V1 U: l
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)# V: V, E9 S" W" t2 f
- addrServer.sin_family = AF_INET;/ M+ c0 B" _& ~ ^6 a
- addrServer.sin_port = htons(6000);//连接端口6000
6 k$ I0 S6 T5 p! d7 s - //新建客户端socket
i$ Y. c) p" b2 _; U4 |1 K - sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);# P: |1 q, x. l( e
- int s = 0;
8 H4 F+ ]3 T+ u" V g: J - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
* Q% M6 j8 e9 H4 [7 r
# c5 S! m) y M4 Q& V- while (1){
. p) n7 B- c3 V - //发送数据
. c; a7 x- A* Y - int a = send(sockClient, message, strlen(message) + 1, 0);
' t& F) V7 x# c; j - printf("to server:");2 a; J2 E' g ?! w$ o; F
- scanf("%s", message);6 \ J, ]! V, J7 Y( R4 Z2 v
/ k' G" K1 Z4 r7 T1 _- }
8 ~% n7 Q& X* H8 a% Q - //关闭socket
! Y( e6 \. k1 |9 l' t - closesocket(sockClient);
* ?& X/ Z* T5 U+ m# \4 g+ F F - WSACleanup();
. A# `% Q$ c5 {7 k) B B0 ]) R0 @ - }
复制代码 求懂的高手来解答一下。- @6 p- b1 J6 i& t' c
谢谢了!, _% D$ [3 e/ ?
, s: |) z" n3 x# B5 {( v1 ~* {9 E- |
2 c: C1 a# O# C6 g) W0 n3 m8 \6 _- d: H
|