您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15953|回复: 2
打印 上一主题 下一主题

[C] C语言 socket 编写简单服务端客户端通信问题

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
- G% y3 A9 r  h8 ^1 H! z( V3 r( E2 k2 e" Y我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。: [" o" Z3 g$ j6 ]5 Z( {5 _- ~2 m& `- e
Talk is cheak , show me the code.
$ R  i2 H( q1 x2 u# Z! N+ @服务端代码:5 O3 ?) j( \- p! [/ k& N8 _- X% B
  1. #include<stdlib.h>
    & [  Z+ Q+ y) k2 ?/ v# G2 k
  2. #include<WinSock2.h>9 z2 Q# i- y7 A: O0 Q1 ~# i
  3. #pragma comment(lib,"ws2_32.lib")
    2 H0 z5 y( C% Q+ U$ I
  4. int main(){$ B6 E* _1 u, b5 x8 u
  5.     WSADATA wsd;
    + P& N& n" ~3 t( _; ^
  6.     SOCKET sockServer;" Z7 F/ R& K. _) g& d
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    + F- F% c5 O& k; r, U
  8.     SOCKET sockClient;
    / a7 {* B9 u5 w8 [
  9.     SOCKADDR_IN clientaddr;2 u* r3 C( w3 p! R6 g4 v
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    - n( y4 b. o& I1 g
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket8 q+ H! q  b4 y5 }: f$ }' L8 [

  12. 6 q* _: J" ?" F5 |5 R
  13. 5 `2 b" W* D. [; ?6 A- P7 ^
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){7 e5 w# U2 d+ f6 Q* P9 @
  15.         printf("Socket has been created :%d", sockServer);
    * ~1 f5 f9 p& q, m
  16.     }9 P8 J6 u4 R5 b5 x8 o1 t& o
  17.     else{
    0 m  u5 j; q+ b8 p5 G' E  v
  18.         printf("Socket create failed.");2 L0 L+ F5 j7 Q  d2 v
  19.         exit(0);( U) o7 @, M+ z7 [  x) J
  20.     }6 [% r5 N3 B4 D+ A' u7 ^6 i
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);9 t( U1 M; V9 |2 H
  22.     serveraddr.sin_family = AF_INET;& M. z# @0 b: @+ b  S- n
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, x* z0 v  k7 V) U+ i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    3 Q8 L- T9 B# g- u
  25.     char recvBuf[100];
    7 D/ e) i4 V3 h
  26.     int len = sizeof(SOCKADDR);
    4 k/ h: s! }8 q7 N0 K% A
  27.     listen(sockServer, 5);//5为等待连接数0 H% f- f0 F* l9 R5 F
  28.     while (1){
    / X2 t( c+ f, A
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    , L0 m: O5 y: n% b! n  H, C, H- Y$ ?2 v6 A
  30.         //接收客户端数据5 @+ R% l; P; m! Z& Q
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    ; \& {" H5 q6 L0 J, N
  32.         printf("to me:%s\n",recvBuf);
    ' d/ @! h3 b1 A( p7 U4 G, w
  33.         memset(recvBuf, 0, 100);* b8 i6 O3 ]0 z8 L8 n  ]( K
  34.     }
    0 S$ A4 ^' |, z
  35.     closesocket(sockClient);
    3 [6 M& P  i5 m& M; q8 ^7 y
  36.     system("pause");" o0 {% c3 K( |) ~+ e+ D
  37.     return 0;7 Z3 H+ e; \3 q
  38. }
复制代码
客户端代码:' d5 @! R, y1 _0 B. q% V: A
  1. #include<winsock2.h>
    1 |% N, [: A4 Y! C: e( C
  2. #include<stdio.h>6 h% y! t) \: l) B8 j" c% w
  3. #pragma comment(lib, "ws2_32.lib")
    % x& t$ i0 T. V6 e7 i
  4. void main()
    - s- G9 k2 D. o, k" `
  5. {
    # B+ F2 [2 P! B+ o
  6.     WSADATA wsaData;
    6 F5 x$ m# X# f5 b2 r
  7.     SOCKET sockClient;//客户端Socket
    % Q3 A4 |/ t4 ?1 c; b
  8.     SOCKADDR_IN addrServer;//服务端地址
    # W/ \6 [2 ^# ^4 z( e6 L2 Q7 z+ K
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);1 c+ U, L% d3 I, O
  10.     char message[20] = "HelloSocket!";
    * @9 T" z6 A/ d, B& `, G
  11.     //定义要连接的服务端地址
    5 Z& S5 [) L! {. p1 O: ~
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)5 T: |2 G3 l. J5 J" q
  13.     addrServer.sin_family = AF_INET;8 `) a6 W  V  l) g  H0 h1 I. W( ~3 B
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    / e) Q# q7 S- w  n
  15.     //新建客户端socket  |" z1 a. y3 o7 q) l$ X+ ^
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);4 _( K4 G) W4 w* |+ L
  17.     int s = 0;" }6 N' f/ e$ I3 a: n
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));% R% X% a' `2 l

  19. ' N% q& f, l" P8 F- Q4 A+ Y/ |
  20.     while (1){0 f4 \  P' I( D4 @( ~
  21.         //发送数据# |) M0 N( w3 X& K# k" q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    1 r8 p  r1 O# X5 [, C
  23.         printf("to server:");2 x, ~, r5 k+ ]( M4 k4 G( j
  24.         scanf("%s", message);
    6 ^: J8 s3 ?( q; @# h2 e0 H
  25. 0 d( _/ C" {& q9 v1 @3 y# a/ g
  26.     }. I6 W4 q9 z- G; G5 L
  27.     //关闭socket/ E& p" h  D6 S" q
  28.     closesocket(sockClient);0 M8 |& T& \8 k! C# d( T7 Y
  29.     WSACleanup();! W" Q# _1 s# B9 g
  30. }
复制代码
求懂的高手来解答一下。
% c) [- R+ \* b) s2 V* l1 @. H, u谢谢了!
) n  f/ Y4 h+ Y% [5 k* {* H+ S. y

; h* [2 d( Y. T4 m9 O6 g8 H5 S8 p) o+ Z$ m5 L' ^. B

. q, ^; z0 x$ x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
0 t, B2 q6 e6 o* A: G: a5 jrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:13 , Processed in 0.081775 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!