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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
大家好,感谢你的回复。3 b8 s& W  u# _# b
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。6 Z1 Z/ \# X% ]0 c0 t+ P' D
Talk is cheak , show me the code.) |+ u  O; C  p9 a% U' r% q: k: z7 R& J' Q
服务端代码:
9 K7 ]" A/ _( e7 s9 u. E8 \
  1. #include<stdlib.h>' _; u: w5 A1 Y7 l
  2. #include<WinSock2.h>
    4 @/ r4 A) d, d5 y, X1 ]; ~
  3. #pragma comment(lib,"ws2_32.lib")0 a) n4 V/ K: J8 ?) t$ B) q
  4. int main(){
      ?: Q" y5 G) b
  5.     WSADATA wsd;' l& Y# @( F4 b$ k7 C+ j2 l1 E
  6.     SOCKET sockServer;8 S7 x* a& k; _% W( B. l
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号! l. u# t) |! t7 T+ }0 @
  8.     SOCKET sockClient;& x" X. ~. g0 ?# O: C& V
  9.     SOCKADDR_IN clientaddr;
    % x3 o3 t$ M" X
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口8 d! l7 Q' }) b0 d
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket9 ^, H. }  E4 R5 x6 x; @
  12. 2 w! c- J  s/ X5 {3 ~- y( ]

  13. # b1 y/ R( l2 c
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){" G6 h% d$ U' m1 q0 e
  15.         printf("Socket has been created :%d", sockServer);: q: O# G; d% Y0 i1 T+ L4 x1 L
  16.     }
    : L! M' X' m  R8 f) X2 ^
  17.     else{. K) y7 q  R  o/ X( v
  18.         printf("Socket create failed.");* K+ o" j1 E4 R: x: r- d1 Y1 U
  19.         exit(0);  p9 j1 B3 \. p. E; C8 p; W; y
  20.     }
    6 k7 {% P! ]7 v! D+ {* X: r" T, j
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    - R# I/ b+ ~/ q" k- Z. Y
  22.     serveraddr.sin_family = AF_INET;3 o4 H4 S4 X$ H
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000* k$ u* ~. X. n0 I3 H7 @9 [. G
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));& q* u" ?; ]! t% q
  25.     char recvBuf[100];
    8 _$ O* i: @( N, i7 {( L% C
  26.     int len = sizeof(SOCKADDR);
    8 J# B5 k% @- `% _( S& W( j# g
  27.     listen(sockServer, 5);//5为等待连接数9 a# k6 d3 l5 ?$ m+ W7 C
  28.     while (1){$ f7 J) Z! F+ e7 C# D$ D
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);! o! @0 K7 j. l
  30.         //接收客户端数据/ a6 S1 Y9 F6 @5 I! M
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);2 e/ m8 O  k3 b3 o1 ^
  32.         printf("to me:%s\n",recvBuf);& y  {8 w* `  n; v8 t/ P0 w1 f
  33.         memset(recvBuf, 0, 100);- d% Z3 n# s+ v7 I( O
  34.     }% h1 ^' {& C2 u
  35.     closesocket(sockClient);
    ( S% n  j1 G1 ?
  36.     system("pause");
      Y) R3 p, |( F7 {9 U) }4 H
  37.     return 0;
    ) b& u+ q( H  m- ~7 W& F" N1 j
  38. }
复制代码
客户端代码:
+ o+ h6 R6 Z' {  p7 ]; h1 Y2 z$ K
  1. #include<winsock2.h>3 e$ f+ w; s- b
  2. #include<stdio.h>
    5 X9 f2 b8 _" p! I
  3. #pragma comment(lib, "ws2_32.lib")/ n% ?) \& Y2 k
  4. void main()
    5 t. T' `) M8 A+ o( x& g! W: f& }
  5. {
    * d; f# }3 f6 Y- {
  6.     WSADATA wsaData;" ?( \8 s3 V  `7 w0 ]" {0 N
  7.     SOCKET sockClient;//客户端Socket" r- E/ l  \3 B' d% }2 @0 \- i3 O5 x' v
  8.     SOCKADDR_IN addrServer;//服务端地址
    ; X- f& k) F3 @7 \
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    8 p, h3 C- H3 @' p# A0 A6 u" t
  10.     char message[20] = "HelloSocket!";5 ?. F7 L* e0 c
  11.     //定义要连接的服务端地址% y' a2 L0 o: B, {: m
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)' j4 c' f! C: o( O
  13.     addrServer.sin_family = AF_INET;1 u& `: x6 t4 ]) |
  14.     addrServer.sin_port = htons(6000);//连接端口60003 N7 x, b0 p1 a) K+ Y' X& f
  15.     //新建客户端socket
    , Q6 i* e1 _1 o6 {# [( D
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    . R2 W: X9 I! V7 L, b, h. X0 v
  17.     int s = 0;0 N# N) y/ D& p
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    , l0 I1 }; m- c
  19. # A' l+ x) h1 F0 H/ W+ L9 S9 D
  20.     while (1){
    ) a* c! g* g6 p8 Y' U
  21.         //发送数据
    , }$ r2 e9 Y' \" B; s
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);
    : x( J  q4 Q, ]2 W9 T6 l: T
  23.         printf("to server:");) s; V. R: a( Q0 w
  24.         scanf("%s", message);% x* @9 H/ b: q% g
  25. 4 V  H3 I5 T0 H' X7 L
  26.     }
    # d" H8 C1 ^6 A8 B- s: e
  27.     //关闭socket
    9 Z- f8 C& `  F# f7 S4 b
  28.     closesocket(sockClient);8 V# _& A& Y& B5 c( E: {. \
  29.     WSACleanup();
    ! H; Y  @/ Y) ^  k9 _
  30. }
复制代码
求懂的高手来解答一下。
6 J5 I: C1 w) K谢谢了!& G7 g5 Q( ]( T7 M( `' H& j
3 m8 L% {1 n3 x3 p* ]+ c

9 L) s" r4 K+ d  |  ^6 f7 w
# _9 P# |; c% t5 M" ~7 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为$ o: ?2 g  N( ?: y
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 15:50 , Processed in 0.131828 second(s), 21 queries .

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