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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
* v3 [/ [; P" a: Y! m- ]% Q我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
! i" B6 j* D! b7 W) R. fTalk is cheak , show me the code.+ \  k. B3 F* l
服务端代码:
2 s. ~8 O" \$ Q. o* @* f
  1. #include<stdlib.h>
    8 L# a5 x- m* D- n+ D* u
  2. #include<WinSock2.h>
    6 r6 G* B6 H& L. c+ p. K
  3. #pragma comment(lib,"ws2_32.lib")
    - O+ B& N5 ^3 ^( F; Y. T& N
  4. int main(){* d: x! S9 G' T8 }% J4 z
  5.     WSADATA wsd;/ s1 H' {7 u* b& E8 |7 q- |
  6.     SOCKET sockServer;2 {; r% v: U4 Z" Q3 [, M& X
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号' X/ D4 g: |+ G1 O% |
  8.     SOCKET sockClient;$ l# o4 J0 H4 m7 O8 B5 j0 {5 m
  9.     SOCKADDR_IN clientaddr;% K! c/ c; C. K) ^' W0 b
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口* f+ G$ E, |) f5 X8 Q5 d
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket7 Q5 e! T5 }% k1 q. L

  12. 2 t0 z9 t: B* M

  13. ! L4 M& |4 ~8 p$ _' y; v& V+ b& R2 F
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){# `8 h4 Z' F2 e
  15.         printf("Socket has been created :%d", sockServer);
    6 F3 ?6 P7 q- Z
  16.     }
    2 `+ n. x/ ]) c& h
  17.     else{
    & g* W1 m* I+ o5 c( H
  18.         printf("Socket create failed.");
    ( ~) j$ n$ W. p$ C; y2 P6 R
  19.         exit(0);  f, m( }" l/ Q  l# z/ ^  H
  20.     }& `& {$ L- M0 ^: J
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ; b7 G' ]* }8 a# ?0 C$ j
  22.     serveraddr.sin_family = AF_INET;
    : n3 ~' t9 B" A( w% i
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000, Q: K0 x1 L: D: Z$ C3 [
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));4 U2 d* p; Y& ~7 l& f; ~9 L
  25.     char recvBuf[100];
    ' D8 J3 q: ]$ ?. j! d
  26.     int len = sizeof(SOCKADDR);
    2 U+ v( @2 h/ t( k; j
  27.     listen(sockServer, 5);//5为等待连接数
    2 [( w! v/ |# x2 D) A- r) R9 Q
  28.     while (1){
    7 {2 a6 P# _0 L
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ }& L. a0 c8 s3 [* i$ X8 h8 `
  30.         //接收客户端数据. v) K9 s) i" q8 I' A) O4 E, S
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    4 I7 p1 A# K: l: n, g& j" a
  32.         printf("to me:%s\n",recvBuf);
    5 a! A& j6 c; Q9 _
  33.         memset(recvBuf, 0, 100);4 @3 Z' D8 a" I6 l7 K& Q
  34.     }
    1 c( E# `) u  x  B% P2 K3 q5 j# f
  35.     closesocket(sockClient);/ j  c* ]3 @& o  E
  36.     system("pause");' Y! \1 J+ R- P  Q2 w0 ?
  37.     return 0;
    5 ?  u+ J6 [! X1 u& o
  38. }
复制代码
客户端代码:
- W5 Z" r2 V0 H/ o, [
  1. #include<winsock2.h>2 U" |5 I4 p& o
  2. #include<stdio.h>. C* Q1 K9 `5 S8 q4 I* y
  3. #pragma comment(lib, "ws2_32.lib")
    ' r; F& X" L2 K# o; a; @
  4. void main()
    - x) z' ~0 J" K' `( Z0 d
  5. {
    , C9 M2 w: i# k1 v! ]- x
  6.     WSADATA wsaData;8 M$ L6 C+ [& U  J
  7.     SOCKET sockClient;//客户端Socket
    ) h6 z0 t/ H# t+ d
  8.     SOCKADDR_IN addrServer;//服务端地址
    ; a0 p1 i( i+ x' @3 e( Y
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    0 y; D  m- r! y! @" A/ s8 D
  10.     char message[20] = "HelloSocket!";4 T0 h1 l( j) i  }+ c- ^
  11.     //定义要连接的服务端地址8 C2 k+ M, V& i' H* Q
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    & }1 l' l; B* Y) O4 C
  13.     addrServer.sin_family = AF_INET;
    : U. K, U, D! Y0 b7 S: e, I, n  w
  14.     addrServer.sin_port = htons(6000);//连接端口6000- f& r- u. n" G7 h
  15.     //新建客户端socket. c7 }5 K/ n" U; z' Y1 j
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);; b/ k0 f. J" _  c
  17.     int s = 0;
    7 n" {' I0 Q& K! S5 J( m8 [7 x
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));. P) v$ u6 n0 Q8 i! G
  19. ! c; b9 F* e& G9 w4 g
  20.     while (1){8 }+ ?& J: Q: K+ r) P% E: Q! _
  21.         //发送数据
    # }7 w' [5 x% |- G% M
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    , i$ n( h( X8 U& f: I1 w
  23.         printf("to server:");
    8 D2 s0 R2 f( L  R) ~8 {7 k
  24.         scanf("%s", message);( C8 b- z8 ^# o. J$ ~
  25. ; c+ Z4 T; r- L/ Y7 N
  26.     }
    " c7 g6 H7 u4 i% |. l& K: A6 z5 o
  27.     //关闭socket
      m" B, b5 S: p% l9 H: q" e
  28.     closesocket(sockClient);
    # W9 Q/ G+ W" n
  29.     WSACleanup();/ R6 K7 N7 K$ l3 @! e+ v
  30. }
复制代码
求懂的高手来解答一下。
! b; b0 a$ G8 w" a, K谢谢了!
9 H4 ]. r7 f1 r: s% C
  B* P. f4 p, \+ ~: ?; }: Z

; |- |, t5 E  t# J/ Z* C9 g' g+ k0 R
% u7 _+ S& G, b& z0 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); 这句改为
; j7 \1 e2 V0 K% H) [- I: C# Brecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-5-19 03:35 , Processed in 0.103189 second(s), 18 queries .

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