大家好,感谢你的回复。8 Y5 f' X+ c/ Q# u8 m, e' U! k. I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
, d5 Z% a, L" f0 a8 \2 ?; wTalk is cheak , show me the code.
2 l- c5 l' |1 ~6 [! c' Y- Q4 A& ~服务端代码:3 x! B! j, [' e- Z( d
- #include<stdlib.h>6 {' U- @/ f& W. p6 |, v
- #include<WinSock2.h>
@) a% Z# L- T# b/ G6 c5 a% t - #pragma comment(lib,"ws2_32.lib")
* H& L" a& C" f% d8 y' h - int main(){
5 ~# X; n* H* D! S" x - WSADATA wsd;1 b, H! Z: B& Q3 D9 _: H% r
- SOCKET sockServer;7 {# ]; N: O( c# d
- SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号. r! w6 |/ d& y' ?9 H7 R6 G/ i
- SOCKET sockClient;4 r; _7 Z6 h. O! j8 a) i) w+ W
- SOCKADDR_IN clientaddr;
' e- [9 d8 W8 Z& _( Y: ^ - WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口1 i. D! S2 ~6 |
- sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
1 R7 J5 m# S2 c5 \7 n - 0 m7 t N4 l' t0 A `6 ~# _
4 B& [3 i8 l) S/ O4 M4 a- if (sockServer != -1 && sockServer != INVALID_SOCKET){8 a0 j6 S3 A, l' \7 f4 n$ H2 {
- printf("Socket has been created :%d", sockServer);+ v1 [( o {6 O* S1 U) Y5 H
- }* `. m8 R" |4 p; P
- else{
- u. g# M0 N, K* }, M5 C: N - printf("Socket create failed.");
! S& P3 J3 N: |# z( B" n - exit(0);
* Q N# n5 K7 ^' U! q - }1 t) F6 {1 a* h: a9 p0 T8 f f
- serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);$ \$ D8 s4 G" n/ ~# r
- serveraddr.sin_family = AF_INET;/ P8 L8 Z4 L: V7 S' r6 p
- serveraddr.sin_port = htons(6000);//绑定端口6000
4 w9 y' t) ]! p: W: n. V$ L/ M - int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));$ e& ?& u. [5 S3 y* y
- char recvBuf[100];
, b: Y$ Y2 b+ D% W+ k - int len = sizeof(SOCKADDR);
4 J* N, y' k! ^) X - listen(sockServer, 5);//5为等待连接数
) C: ~2 P# Q( V8 J3 A - while (1){6 b$ S% B8 S. b' `/ X/ `: _5 Z
- sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
% f1 W+ N0 \1 \, w0 X4 g - //接收客户端数据
5 F% Z# _# r4 s" Y. Z3 x6 y - recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
/ k! F$ Z* p* ^5 G - printf("to me:%s\n",recvBuf);6 t" v4 r3 b: B# i
- memset(recvBuf, 0, 100);
6 _5 O6 m; ~( j9 a# P - }8 y* P3 [8 v: R. Q5 d1 U" i! j
- closesocket(sockClient);
; U# ]3 o' x3 N/ q0 O7 E- E2 w - system("pause");! z& h$ F8 y) P2 u C
- return 0;
4 b: c$ q& P( o' I- S4 o6 S - }
复制代码 客户端代码:% U; o. N7 G5 K3 a$ N' Z i
- #include<winsock2.h>+ V) z$ m9 K7 J5 n) e4 }% h% K+ q3 }
- #include<stdio.h>
2 G0 X8 w/ B1 n1 e' ` - #pragma comment(lib, "ws2_32.lib")$ w5 M% P/ ], k8 _! y, u+ a9 @
- void main()
/ s9 M# e* G m& l - {- m4 _3 [+ L% b, g2 }6 S: \) l
- WSADATA wsaData;
$ ? o$ |( U% x% w - SOCKET sockClient;//客户端Socket
4 v3 H9 f8 Y! }1 _9 ? - SOCKADDR_IN addrServer;//服务端地址
+ ]3 ^" p; }" ?# J8 G5 x. e& Q - WSAStartup(MAKEWORD(2, 2), &wsaData);, ~& F, B. D; p! u! o
- char message[20] = "HelloSocket!";
* [+ b% B0 E4 C8 b- Y2 w0 z - //定义要连接的服务端地址
* @; j8 s& J- r( y9 B - addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)! L+ p: R9 R6 |/ h
- addrServer.sin_family = AF_INET;
2 B) u" w% N* d/ D - addrServer.sin_port = htons(6000);//连接端口6000
/ t5 B5 ?: ]* t4 x% p9 i - //新建客户端socket" t' [4 s* n# c+ D5 J
- sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
/ H- j1 E# q2 e' ]+ H% Q$ f3 S* D - int s = 0;
v- Z! `) R4 \$ T - s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
, D, B2 h( W9 M' n) I6 p: W9 d+ l* {
' R' i! ]/ L7 a3 h c1 R# Q/ ?- while (1){6 O% ]3 O( R, a. ^/ k- i6 A
- //发送数据
4 ~7 O* K I7 B. _& N5 ` - int a = send(sockClient, message, strlen(message) + 1, 0);% F \/ S. [9 r8 x- I2 S8 G
- printf("to server:");
% c/ c, a R/ ~/ t; M - scanf("%s", message);
4 v! P' S9 [ @
, k9 ]8 v, `6 B, T |* p/ t" {- }, Q; d. ? i b/ {+ H3 _& U
- //关闭socket
; I/ C# ~* B0 [9 V! w1 d. f - closesocket(sockClient);( z" C5 o8 J' E5 x# m. X
- WSACleanup();; f+ x/ Q% \9 q# r+ ]/ R% m
- }
复制代码 求懂的高手来解答一下。 ~" E) L |+ ~: ^8 g- d
谢谢了!" X4 A0 g+ | n: d
& U9 Z# v# m8 @' D0 H
( |. [9 z5 Y7 R/ \& J6 c( o. ~8 s' T8 Q% f% p- b
|