cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
$ M" ?. e/ ~$ ]$ A/ z2 e" s
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
5 w6 w h1 U( M S9 V8 W+ y( D2 \. m
Talk is cheak , show me the code.
5 m) P9 V" ~ j; S+ V1 c5 r
服务端代码:
& z! T+ H0 B0 g' L+ ?7 G) _: F
#include<stdlib.h>
5 F, }: W' h1 y
#include<WinSock2.h>
1 E i; M1 B& K0 M! Q( \# c
#pragma comment(lib,"ws2_32.lib")
K) [( F/ B: ~/ z) c' k
int main(){
( r5 w3 R; ?& M( W6 s v I* D2 e# `/ V
WSADATA wsd;
7 r4 Y1 k' z1 u# Y, R
SOCKET sockServer;
: v3 `) ?% G! O, f4 Q3 g
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
- w- n9 i' t* ^; Z% {; |: A
SOCKET sockClient;
0 h6 C$ H$ B& \' i+ R, _
SOCKADDR_IN clientaddr;
( C& c, t) Y7 w
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
1 D! i% ]+ j7 h8 N) o- N% L* c# T
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
5 f" V6 R b5 ?3 T( R/ U! |
& m) Z( k& ]( P
: }. [8 P. t6 ?7 ]; R
if (sockServer != -1 && sockServer != INVALID_SOCKET){
5 |- s4 L4 j8 ` e( D0 `
printf("Socket has been created :%d", sockServer);
" n1 N7 L, P0 w$ G5 S" g) Z, b- \
}
1 K, m9 \5 a' E; ?+ |
else{
+ ~ Y! I3 G, a8 |, e8 i8 C9 i
printf("Socket create failed.");
7 P! s2 }2 M2 l |
exit(0);
3 a- ?6 d6 w: {& g
}
+ ^; [2 `: Z3 h1 P& J; z3 b
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ Y6 M- x @ P: j' W/ ]( j% k
serveraddr.sin_family = AF_INET;
& w6 j8 |9 r, Z* K3 j ~0 s/ T
serveraddr.sin_port = htons(6000);//绑定端口6000
, O. O+ J7 h# I; _' T k k
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
Y0 Y' j& Y: K' g4 ]
char recvBuf[100];
7 L: O/ a$ E p: o9 p* b( n1 S
int len = sizeof(SOCKADDR);
2 f: e# R( T" N/ H
listen(sockServer, 5);//5为等待连接数
6 |3 D* T( Z4 k' S9 Y
while (1){
+ }$ i+ C* r- B$ {! n- H
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
) S) ?' H1 d2 `) q9 x! u
//接收客户端数据
+ e# S0 t2 |; G& f( ~
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
5 c' e8 @0 W. ^' u4 j% \7 J
printf("to me:%s\n",recvBuf);
: R6 U' a: Y8 h4 v) ~" N" H* Y. a
memset(recvBuf, 0, 100);
2 x9 _" ?! ?% D" a5 y6 m5 k
}
! _% ]& o' }8 C) ]6 [
closesocket(sockClient);
. f. U1 |+ d! _# c, B8 o; v
system("pause");
' E7 a; o3 w: [
return 0;
9 P9 J _2 y7 m9 d j0 q( y
}
复制代码
客户端代码:
$ {$ h' K/ }* q4 q( l8 G! Z6 h) b
#include<winsock2.h>
* N5 ?! l# T, w L1 l
#include<stdio.h>
, J% G1 L: a$ O1 {0 i4 U5 f$ V
#pragma comment(lib, "ws2_32.lib")
: g( q, S; {& v1 }6 z
void main()
' ~- m# r1 l, e9 e
{
9 t+ \' k. q9 F1 G- @. D" j
WSADATA wsaData;
$ R# C/ v Q ]6 Q V& o) Z. l
SOCKET sockClient;//客户端Socket
' M z" ~& ^2 R; Y6 U0 }' e& n
SOCKADDR_IN addrServer;//服务端地址
( E2 U% _- k; p" Q3 q
WSAStartup(MAKEWORD(2, 2), &wsaData);
; i* S+ y; n" P' Q
char message[20] = "HelloSocket!";
1 C0 m6 H- o- ]# p$ i1 u9 R2 _
//定义要连接的服务端地址
8 R V3 ^. g& m* ~& f
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
$ f* t' o4 X8 B1 X
addrServer.sin_family = AF_INET;
) n' X! @9 z; I
addrServer.sin_port = htons(6000);//连接端口6000
. q! T8 n2 ?! d
//新建客户端socket
( _+ z5 B/ X' S1 n
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
4 @; m# P- A( } Z% S) l1 z- ]
int s = 0;
: j4 D- Z- b+ a
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
8 \$ Z, |! b: T+ `* {- |% [; b
) Q* \9 T2 N) o0 K9 C
while (1){
8 A9 G; Q5 F+ e* a/ X
//发送数据
8 t0 `; n1 ]0 j, ^) ~) Q1 |# g
int a = send(sockClient, message, strlen(message) + 1, 0);
b3 G! ^" } p2 ` z; v
printf("to server:");
4 t; \; m+ x- o' d
scanf("%s", message);
( v; |) j& G" l5 C V' y. i
% K; \5 R/ g! V3 ` R2 [+ w4 P( X
}
! U" r& e5 H7 w. ?1 k% M
//关闭socket
3 P: E! U& B4 x& l. r- F
closesocket(sockClient);
8 N. K* v( {9 L/ h) y$ ^+ ?
WSACleanup();
; h7 T& l% k( k& D6 ]1 J
}
复制代码
求懂的高手来解答一下。
5 l2 P9 a, d0 t. w
谢谢了!
I) F6 p; d5 L: ]; u# L5 |$ _
6 v3 t6 j3 G t5 u4 ~- }7 e
/ x+ m \# e8 T4 j% b: O" _4 G
, Z/ V2 {: H9 w3 A/ }
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
+ z# j u- Q: H q3 H$ ^
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2