cncml手绘网
标题:
C语言 socket 编写简单服务端客户端通信问题
[打印本页]
作者:
admin
时间:
2020-5-9 02:32
标题:
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。
7 y" v* ]# V8 T8 y/ Q4 Z7 I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
) b* g8 g/ ?+ p. N- F3 Q9 a
Talk is cheak , show me the code.
" c H1 o4 f z" v) H
服务端代码:
% a% m6 X6 R& r- H0 p
#include<stdlib.h>
! U4 x, b$ Y& Y; W
#include<WinSock2.h>
5 r7 Y5 ~+ t9 Q5 Y
#pragma comment(lib,"ws2_32.lib")
4 X: x6 W4 I' h: F Z0 n8 a
int main(){
1 b3 }7 ~4 _5 y
WSADATA wsd;
+ ^, f0 U( G0 E7 \) _) E# L1 k- ~# P. S
SOCKET sockServer;
; q! U I9 P4 t2 T
SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号
; H! X' Z D- a
SOCKET sockClient;
% M1 ?# K7 n5 W. e$ u" N
SOCKADDR_IN clientaddr;
0 m0 q' K9 A1 n- O1 ]; \
WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
; s W& ], i1 |+ c8 P# c% M1 x+ Q( E
sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
$ |' t7 D& h6 L ~6 ?6 H
# q( y" M- U; L! A
1 T7 `4 I" G! Z1 i: b1 w6 w
if (sockServer != -1 && sockServer != INVALID_SOCKET){
# Y+ T* z1 t% {4 W: ]4 \$ N
printf("Socket has been created :%d", sockServer);
+ r( ~5 _9 I! B9 ~
}
/ ?/ U- m7 T; F3 a$ b$ u3 m% H( p6 f
else{
T" ]0 f+ e- d3 }3 R/ A
printf("Socket create failed.");
" }- s) H* m0 B
exit(0);
" ], Q+ p7 O8 b# \/ `
}
# j z. P, x) d" i; ]. C
serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
$ B/ f v5 f C, X
serveraddr.sin_family = AF_INET;
3 E" O6 B- { |4 H7 q2 S8 M
serveraddr.sin_port = htons(6000);//绑定端口6000
" s2 a$ a3 L' N1 ]# n5 X
int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
; p9 Y: S* v/ @' G, z" Q0 V7 J: j
char recvBuf[100];
1 v% |" g3 t, z8 e$ M1 s& d0 n+ R
int len = sizeof(SOCKADDR);
! Z3 E) l, u" ~4 ^) A, Y
listen(sockServer, 5);//5为等待连接数
% m2 z* y- c2 Y$ Q* ~
while (1){
9 Y( a2 f+ d, c+ r
sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
& }5 L7 s+ b7 _+ \* Z; T( h
//接收客户端数据
1 `$ I( M3 m6 j, _% n
recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
1 K6 o- B$ x R% v
printf("to me:%s\n",recvBuf);
6 R; C$ c; Y# C" ^+ v8 H( ]+ C
memset(recvBuf, 0, 100);
. o1 j/ G: v; {! P* B% N% A9 F
}
6 e" z* X& U2 L9 n3 K6 K
closesocket(sockClient);
: p; u: r* }% x: s: I+ p- j
system("pause");
3 ]1 v' d+ J q# v d8 Y
return 0;
# _9 O5 {( [, P; S3 q6 j
}
复制代码
客户端代码:
J$ }& \; h$ [, q& c
#include<winsock2.h>
" K* ]8 p1 j' D4 M# k
#include<stdio.h>
( D2 q8 W( }: y6 r; e( D' ]4 n' l
#pragma comment(lib, "ws2_32.lib")
$ b( y8 D& C I6 { P1 m8 t
void main()
; {' ^7 h1 E2 Q8 e+ O: a
{
0 s) _3 c; W2 i! |- k
WSADATA wsaData;
2 f$ |2 Z7 ]9 p" w, ~4 K* W2 ? I
SOCKET sockClient;//客户端Socket
9 \: q5 }; ^3 [$ f8 V3 N m1 u
SOCKADDR_IN addrServer;//服务端地址
2 K( I' |9 S( v! D9 ?$ |& m8 x
WSAStartup(MAKEWORD(2, 2), &wsaData);
; |; k D7 a! Q: u
char message[20] = "HelloSocket!";
+ ?4 ~. o3 I+ X+ B+ M/ h
//定义要连接的服务端地址
/ @1 u5 j. z: k: m1 @* `' m1 s
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
) @6 p7 r% x w
addrServer.sin_family = AF_INET;
8 W* @ l+ }- J0 ^' ?
addrServer.sin_port = htons(6000);//连接端口6000
. \# |0 H! y: O) v
//新建客户端socket
3 ]! y) `; }+ ~3 a
sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
% V1 Y, E6 S* b6 U1 {
int s = 0;
* B3 r" I' ~6 M/ `1 a9 p
s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
& ~9 ]7 y7 ?+ ^ ?1 R
8 w( {& D/ m# R
while (1){
' d9 `$ @8 n4 ~' {. {$ R4 h8 Z" I
//发送数据
& @2 O+ l A# H/ x2 \8 a# ]: k7 M
int a = send(sockClient, message, strlen(message) + 1, 0);
! H9 u! Q6 R( s1 j% Q
printf("to server:");
- q# r+ r' M( e8 H
scanf("%s", message);
3 b' Y0 P4 l0 J7 N% Z6 ]2 r
+ `* t3 n( A* r" x3 [5 h1 Q
}
U/ Z* d: o0 H/ t6 g
//关闭socket
9 c, S% _" R1 v' q( o' C% S5 D5 Z: t
closesocket(sockClient);
+ ?6 n A4 h5 a0 Q
WSACleanup();
9 ?+ G( n6 ?4 [- R3 L
}
复制代码
求懂的高手来解答一下。
' L Q3 w3 G+ l& e7 Y( [! E
谢谢了!
& U+ \' J5 d) H1 K& \. i% _" U! X
( L) [3 {, o! B( X$ G( B
. y# L8 t# g9 x) c, e% ^
2 `& E7 p S: M8 r
作者:
admin
时间:
2020-5-9 02:33
应该用多线程或者多进程,,,过两天给你源代码
作者:
admin
时间:
2020-5-9 02:33
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
; D" V. ^5 }1 ~+ Z T% x6 i
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2