cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
+ V: u, @0 g L2 i/ p0 q
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
8 O4 N g! F: d" u% y8 l/ o
Talk is cheak , show me the code.
! |* o& @, T2 m4 v% b' d3 d
服务端代码:
& n7 k8 o$ k+ k! r* r
#include<stdlib.h>
$ @ D( I( G& V/ |" K. T
#include<WinSock2.h>
p6 Q& {- \. c2 ^8 `& [
#pragma comment(lib,"ws2_32.lib")
5 K& N! G9 \* D7 D) `3 H2 i1 I1 x
int main(){
! l' o& i) ~8 D& N
WSADATA wsd;
, E8 ]# c* ?/ P6 I
SOCKET sockServer;
/ }# ^. g# k% U
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
; E5 }" r% o+ r( I* d4 J
SOCKET sockClient;
, z8 i: g" ^. k @8 y& S9 K# d
SOCKADDR_IN clientaddr;
* y6 V6 V* _3 H4 t
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
3 A! m9 E" I- Z [- g
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
$ o1 W. r- ?8 r5 t, D. _) o7 x* w8 o
, B2 y& x6 u9 J. {5 `8 q4 ^7 O; m' D# q
3 Y2 ?0 e# P6 s3 A
if (sockServer != -1 && sockServer != INVALID_SOCKET){
( L0 \, w9 F) B( |: C5 J
printf("Socket has been created :%d", sockServer);
& ~, I1 U7 N9 z' I
}
; v& h) |# d7 b8 Q! \4 J5 x
else{
4 b6 X# t9 Q5 r2 q6 \. G
printf("Socket create failed.");
+ i( ^9 z5 b% s$ Z
exit(0);
3 p* \4 u) n) P( J p- j: W
}
6 S! s+ {. y' z& \2 A
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
3 B6 c' j) s8 x9 X6 C
serveraddr.sin_family = AF_INET;
- p7 `- q% D+ J( `, t
serveraddr.sin_port = htons(6000);//绑定端口6000
( J' Z# N& ], r* _& |& J, H8 l M+ D
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
% k+ m( H5 E1 g7 F' [" @: r
char recvBuf[100];
. u1 R; d6 P! e! o- ?
int len = sizeof(SOCKADDR);
* s, y8 O. @- L8 Z4 U' _- ^8 z# q) h
listen(sockServer, 5);//5为等待连接数
' Z# u& q+ m$ K; D/ s0 X/ u
while (1){
4 u" h s- `0 P2 E4 U+ I! ~" o
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
% @2 z, |* B( D" l
//接收客户端数据
3 _" u' B' z9 X
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
& o6 S# h4 o1 U4 K- A }
printf("to me:%s\n",recvBuf);
- G, m. Q3 p! N6 @- b
memset(recvBuf, 0, 100);
% Q/ s, q$ p9 G9 T, B
}
$ |! `( ?. X$ C! D ^
closesocket(sockClient);
) I1 g9 W) t+ r/ x9 T4 p( ^
system("pause");
! T" }$ Q% R: G- Z8 F7 r! ~
return 0;
3 c" E, k6 p- W7 _
}
复制代码
客户端代码:
" e4 m9 v, S6 ? N9 p
#include<winsock2.h>
9 S$ ]5 M7 E$ |% G" s2 T
#include<stdio.h>
/ _) w0 `/ L4 ^
#pragma comment(lib, "ws2_32.lib")
9 U z4 |' g% @ B( P! H, ~4 H8 ]7 I- @
void main()
3 U9 X/ ~ J: Y
{
7 l# C* ^4 g1 C" K
WSADATA wsaData;
" H) y4 D6 O6 ]
SOCKET sockClient;//客户端Socket
# F$ H6 u x' z. D# c' i( \
SOCKADDR_IN addrServer;//服务端地址
( v/ b' }6 T5 p H+ U
WSAStartup(MAKEWORD(2, 2), &wsaData);
: I- E4 ?4 n5 f6 {* l0 R
char message[20] = "HelloSocket!";
- X, `# V& e# e; y# f* S
//定义要连接的服务端地址
# y8 B7 k* d# A' u$ a& K; } [
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
' E, X& A2 |/ i7 i2 j* n6 E
addrServer.sin_family = AF_INET;
2 s8 s' Y. N8 x
addrServer.sin_port = htons(6000);//连接端口6000
9 U4 N; {+ F2 g8 J2 i0 a% o3 J
//新建客户端socket
- H; k9 b/ [& h; i% @
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
0 [$ T2 \9 R# G
int s = 0;
) N0 O- x) X6 s$ ^* ~
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
8 ] p$ A; |) o; z) s* W
2 n2 g+ ~. g; A8 n' \
while (1){
& U4 C6 Z! d% k& D+ \+ U- d
//发送数据
" {" K: L" ^4 a" J6 y- k
int a = send(sockClient, message, strlen(message) + 1, 0);
( v* T0 C* s7 V5 Y. r, j
printf("to server:");
, _* R/ N6 y& y: @
scanf("%s", message);
2 d, I1 o# J6 t V" u
8 v# Z Q7 P. [- p
}
+ b! w% B- P7 e
//关闭socket
( U9 W* m- T7 B: V1 e1 W2 ?( d
closesocket(sockClient);
@3 Q4 E: A3 x: Q
WSACleanup();
$ U3 C- |3 \4 ]- z3 q3 K% ~
}
复制代码
求懂的高手来解答一下。
% `" n4 Q8 J% a8 s6 y# B0 n% D0 `3 U
谢谢了!
% J1 W6 _6 T8 B0 B
/ b1 n: Z) r9 c
- H$ e6 i. L- I9 ^# q. s+ [+ J
2 q; \4 H( ~& }& f
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
, l) f' A0 W/ E' Z+ d6 a
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2