cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
; i2 u. r1 t- S
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
% J; e, N$ A5 _* \# l5 j) U& f
Talk is cheak , show me the code.
$ d! i* X {+ a3 z2 h* K
服务端代码:
7 ^' K, [, @! I M
#include<stdlib.h>
8 l' @* V o3 U" I3 Z
#include<WinSock2.h>
8 I. k, i. J2 h* c" U$ g6 g
#pragma comment(lib,"ws2_32.lib")
5 e; Z1 B8 {* H
int main(){
$ E0 l/ S* k2 d' Z7 D2 f y2 `
WSADATA wsd;
! }2 N# {) T b: @+ O! z) B4 _
SOCKET sockServer;
) G. J/ l e% R% I0 f6 W
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
3 ]* r8 a" m9 P1 S% o- D4 ~7 ~
SOCKET sockClient;
, F6 N n5 n1 d( ^
SOCKADDR_IN clientaddr;
" l$ ~6 a% r4 D; e* P
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
`4 M7 c. V2 l
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
' \6 B) {- [* q( N3 O# i& l
( H( n6 A1 U. G
$ @' C8 u% J4 s, E# u% I( \' L
if (sockServer != -1 && sockServer != INVALID_SOCKET){
2 b* V7 D7 x0 o3 d8 P# @0 [, N
printf("Socket has been created :%d", sockServer);
1 }- h/ a# C6 f5 g7 ]- i
}
' Z0 k* Z2 o* w4 F3 t" k+ n
else{
( l* i$ f2 p1 _' c, I A5 h+ t* e* N
printf("Socket create failed.");
$ s1 Y% z5 Y* A( ]; [3 G
exit(0);
9 S( x3 D9 H0 x6 J- B; J" ~
}
1 Q, C" o$ [' ~8 K
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
& _# ^9 g* v. y4 @" t1 C
serveraddr.sin_family = AF_INET;
: x4 F& {5 A8 Q9 X' `- L
serveraddr.sin_port = htons(6000);//绑定端口6000
$ e) W4 \* ^, b/ ~2 g& Q
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
9 O9 m1 d1 L6 N0 v6 O7 n
char recvBuf[100];
3 F6 H7 T. T8 c
int len = sizeof(SOCKADDR);
; a* ~7 F6 y* A+ M: ~/ u9 Z
listen(sockServer, 5);//5为等待连接数
# a3 `4 j- X# t n3 m
while (1){
* d1 Y7 F, _# r8 o
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
}4 ]9 h1 C8 q$ w/ q6 v8 T
//接收客户端数据
1 H n; \, }, P" _
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
) w" U0 U; j9 ]; c( f7 ~
printf("to me:%s\n",recvBuf);
$ |4 t( |: z3 I# p/ N
memset(recvBuf, 0, 100);
2 m, ^" `5 d. y! S+ z1 I2 u" @
}
4 R4 u6 y; i3 \) e1 z
closesocket(sockClient);
/ h. p6 }. o/ X8 D/ W2 y
system("pause");
) ?# F; [% H: R" M7 p# s
return 0;
) r* E+ |1 Q' P2 q% o
}
复制代码
客户端代码:
% E( t1 \$ a9 E! W; i% ^4 M2 @
#include<winsock2.h>
! e& b: D* c5 Q' e" \
#include<stdio.h>
, {3 t; g$ L- u
#pragma comment(lib, "ws2_32.lib")
& G8 ?0 b! x) N/ @% C
void main()
8 o6 _2 P0 }( P2 @
{
+ V/ |3 F0 C5 t: A# d
WSADATA wsaData;
+ R* n5 o* h% h" j+ H8 ?
SOCKET sockClient;//客户端Socket
. A4 g) o) a t _5 ]
SOCKADDR_IN addrServer;//服务端地址
# s, {; s# |. ~* W
WSAStartup(MAKEWORD(2, 2), &wsaData);
- X7 l+ D/ `7 j3 T3 s" O1 A( L
char message[20] = "HelloSocket!";
: y! v/ N+ \1 X6 z- y* C! n
//定义要连接的服务端地址
. z9 u b. \* z
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
& @ V, i/ v4 \) A8 a4 Y' j L# K* ]
addrServer.sin_family = AF_INET;
2 q, Y5 S6 z8 }5 o8 y+ w% u* Z
addrServer.sin_port = htons(6000);//连接端口6000
: h& f! P3 V! a! ?0 h
//新建客户端socket
' C5 B R+ H8 J3 E8 A/ _- r
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3 M* G* W! q3 c2 t
int s = 0;
/ ?8 {9 C6 J, g' C8 i9 n( O
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
" V5 T3 F7 ` {# t' }* Z$ g2 l# F$ o
; C f+ A$ _9 D; Q
while (1){
; @4 |5 P+ y/ _ S; |
//发送数据
) O( r X# e1 e" B2 W
int a = send(sockClient, message, strlen(message) + 1, 0);
6 k% k( S& l% Q# C; W
printf("to server:");
9 A X# u( U% [' f/ B( k8 K [! P, i7 U
scanf("%s", message);
8 k/ |* I R c* w6 X# c. x* w4 G
/ `" i5 X! |7 ~* n: b
}
2 C- t5 f% D( b1 f5 o4 }5 m
//关闭socket
+ `( L- _& ^8 H+ ]
closesocket(sockClient);
5 `4 e& T7 R7 m, [" L% H
WSACleanup();
9 K7 _ }6 K0 h' H; ^0 x) x& Y* R
}
复制代码
求懂的高手来解答一下。
" O# S1 ?% Y; B. J* q- N$ i
谢谢了!
( {4 g& J: N/ J( B) J
4 t% Q, C5 Z# G$ k' o
: o% {4 }$ N- m7 p
K- U3 V! K' I- ^' Z9 k
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
/ t" r* n: _; \; u& r& g4 D# C, j
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2