cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
9 S' L& M9 M# I: e2 Q
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
4 i* I9 h- d6 c0 ^2 ?! M' J5 p
Talk is cheak , show me the code.
( A9 |4 p) H) r6 s |( u
服务端代码:
+ ~% \) X( P j/ n$ P( f0 B- k
#include<stdlib.h>
. G- L/ d8 q4 Z+ [2 M8 G- |+ s# m
#include<WinSock2.h>
7 t6 T# P7 {: }5 |+ I. v4 e
#pragma comment(lib,"ws2_32.lib")
8 E% F* }' l8 }( Z
int main(){
; U7 X5 t! C- ~
WSADATA wsd;
) X7 z* I; J, ]. J1 p
SOCKET sockServer;
8 q- ~/ {' ^3 ^
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
! G) Q) Q5 [8 l
SOCKET sockClient;
' @* n3 [# e; @ `) s
SOCKADDR_IN clientaddr;
( X& i" e/ o6 L5 b/ T, q
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
. s% u& F; @7 q2 l. K& ]
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
0 [4 e( Q+ l" }, f" _* [2 O2 H5 @
, C3 d" [9 j2 w: S
; [: U+ |; k+ m" S( E( i$ d
if (sockServer != -1 && sockServer != INVALID_SOCKET){
- K: {/ H$ }8 H
printf("Socket has been created :%d", sockServer);
& Y( T2 n0 i" m) W: `( M
}
0 R J. q8 e- G! W, N
else{
0 b2 V' i8 w$ h' W7 g' s M
printf("Socket create failed.");
5 u+ _- }6 i4 Z5 w- S2 w" F8 n
exit(0);
: G: N' _! i2 ~. Y4 |2 l, w
}
+ T, X" |, }2 |$ c0 {
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
8 B# ^- Z& x7 U+ X0 |+ h
serveraddr.sin_family = AF_INET;
3 Q7 b. u8 W; U+ Z
serveraddr.sin_port = htons(6000);//绑定端口6000
8 z6 H; u+ {1 _. m
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
2 j! d+ b/ n, a9 y1 @
char recvBuf[100];
6 N( f" x( I9 A, |7 ~
int len = sizeof(SOCKADDR);
8 M/ E$ W. i( V/ B4 J- z. H+ K+ [! B
listen(sockServer, 5);//5为等待连接数
5 d; l% q! p/ b, U
while (1){
r/ s, }! q; c0 Q" X0 u3 R/ e- X
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
2 j6 b7 k5 Z" L: p; @% |3 x
//接收客户端数据
% \8 J0 Q M' D( O% _; V8 c6 g
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
; D/ V2 K9 l$ ~8 Y
printf("to me:%s\n",recvBuf);
/ L' D6 M$ d9 i4 Y5 Y' s
memset(recvBuf, 0, 100);
: ~, h Q+ [, f! `
}
7 T" v- i6 H& o
closesocket(sockClient);
% i- N- E8 b" M, c" J' P# \
system("pause");
- A( T! z y4 y7 b Y
return 0;
* f$ [" r) d7 v& d% Z# T" j
}
复制代码
客户端代码:
4 D) z" o4 _. N+ L: V- p" ]* U
#include<winsock2.h>
; a6 C$ x s2 b9 z/ t4 D
#include<stdio.h>
% I8 B) K. E9 B! Q( \; p/ T! p
#pragma comment(lib, "ws2_32.lib")
- d% c7 f' D8 _7 J7 I
void main()
3 T& @2 O8 q9 k: \/ f
{
& ^$ c" V, W1 S! {5 y
WSADATA wsaData;
" \; D, ]5 k+ s$ a; N
SOCKET sockClient;//客户端Socket
6 \+ f# S3 g7 b0 B
SOCKADDR_IN addrServer;//服务端地址
+ Q+ g% e7 t( s. j, ~+ v% `% _' z
WSAStartup(MAKEWORD(2, 2), &wsaData);
8 U4 b0 v; N3 u+ }" L7 w
char message[20] = "HelloSocket!";
M+ G X: \' z! `7 B# x4 o
//定义要连接的服务端地址
6 d9 ?% _' X; O4 z& `( T
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
1 L4 O8 M/ N3 \
addrServer.sin_family = AF_INET;
8 ~: l; Y; q( }; g" F0 F5 r) M% l
addrServer.sin_port = htons(6000);//连接端口6000
8 J0 i! z: n! A$ E( q0 |: `
//新建客户端socket
2 h6 L( D# W' K0 N: V. L
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
: {! l: S* b- k' ~0 ?- Z' z
int s = 0;
: x+ [9 @2 {! H( @8 D
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
: u& `+ T6 v0 [+ f5 a2 ? n
6 c" J1 i, G/ a- }) D" e. l; e5 m
while (1){
6 s4 G; f, ~9 m8 i1 { c0 T% }
//发送数据
0 Z! ~) Z+ O; Y
int a = send(sockClient, message, strlen(message) + 1, 0);
* C. ^. b$ a& q0 X( U9 g
printf("to server:");
) R$ {# B0 \" d
scanf("%s", message);
% a# `7 \, @/ K) A7 X
7 r9 b0 ^1 v8 K! t
}
$ g4 t3 ~/ w* e
//关闭socket
" S5 s6 ~0 T, K- y
closesocket(sockClient);
7 B7 ?/ t* g4 Z
WSACleanup();
% S/ q/ A4 C4 N0 N: E& T* P
}
复制代码
求懂的高手来解答一下。
/ x1 u9 Y6 z- P9 i! J
谢谢了!
/ O5 j3 t2 \5 b! J5 Q- }% l% w
5 F4 t0 M( \- z8 \3 M+ L
% h4 p/ `/ S; [& E$ ~2 k/ K
! }+ G( |: s' `/ H/ m& {
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
# Y4 [$ }& i" e
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2