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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
$ r. t8 M# Q! F! i: r, w' ~6 P  q. R我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。* g/ T* s4 a' D% K, K; w
Talk is cheak , show me the code.
; ?9 }9 z& `, \服务端代码:& l+ g7 n" A! d9 [; Z" n, v
  1. #include<stdlib.h>
    " Y( ]% X( H7 T1 d1 b# I9 ]
  2. #include<WinSock2.h>
    7 ^% }; S  m" S& z5 E3 \* J
  3. #pragma comment(lib,"ws2_32.lib")8 r& U3 M/ t7 ~" Y1 F! E7 Z
  4. int main(){7 W* G: ?% @+ t6 M
  5.     WSADATA wsd;
    ( U# ~# w. Y; V" C
  6.     SOCKET sockServer;# F& r. |/ I1 @5 y7 x% z
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    % J$ f4 e. \' d& |# e
  8.     SOCKET sockClient;
    ( j/ M* Z+ h. O5 n3 M
  9.     SOCKADDR_IN clientaddr;/ d  q6 d5 y7 }+ I- g: {9 I
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口0 X6 ]+ ]# ~+ h7 ?8 I* P+ F( Z
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    % B) R+ `  n! s9 S; T9 E
  12. 8 o: Q$ [+ L& h; E" p# p
  13. * a: ~& r0 F# \, b# K: ^, D
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){' ^+ f3 o  ?. Q% T$ }3 L
  15.         printf("Socket has been created :%d", sockServer);
    % Z7 m2 M& A! r9 z/ M
  16.     }
    3 T/ b& c: G% f7 a9 i8 F2 v% o: r
  17.     else{
    : Q6 O. D+ x4 e. T
  18.         printf("Socket create failed.");' H# M$ k, G" T$ K8 N) E3 q
  19.         exit(0);
    6 b" q+ o1 T& m. T( S1 |+ A
  20.     }
    / ~9 Q6 i$ S+ m# e
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);* a: G- g) n0 ~! z4 @
  22.     serveraddr.sin_family = AF_INET;2 C' o0 e6 T( C/ s1 Y- n
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000- e) E4 d( E& n! j) l5 b4 @2 Z4 _
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    ) ~6 _3 r2 U3 ]* B
  25.     char recvBuf[100];4 |7 e8 R8 v4 P( n0 m/ M/ J% Z
  26.     int len = sizeof(SOCKADDR);
    ) j, \, v3 h* b& d) \; I
  27.     listen(sockServer, 5);//5为等待连接数
    9 [7 z1 ?; K. J: Q  y9 M: F
  28.     while (1){
    * v/ f7 ^/ o. p3 Q% L! Q3 U
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);7 U' O- t; c& X" k% C2 Y) r
  30.         //接收客户端数据5 k' N; b6 T1 p' E! g& B
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
    2 `: E' s& H  g5 {
  32.         printf("to me:%s\n",recvBuf);$ ?5 H2 t9 B+ I, E3 E2 l7 }" H
  33.         memset(recvBuf, 0, 100);
    3 h3 f: d' H3 l. |0 Z
  34.     }
    ) x2 E2 ~, g9 E- A$ {  }6 F& l' U7 o
  35.     closesocket(sockClient);& H  v% \9 n8 ^
  36.     system("pause");" k  q! P% G0 T: L# D
  37.     return 0;, U5 |( |% p' F2 m8 ?
  38. }
复制代码
客户端代码:
* k9 S: C' E, A: M: j) z# v$ i+ v
  1. #include<winsock2.h>
    2 u6 t5 c# f" S
  2. #include<stdio.h>" a9 e, S8 V0 J6 E% E
  3. #pragma comment(lib, "ws2_32.lib")
    1 O* v: R7 P! Z2 d
  4. void main()
    1 u( m2 e9 q2 Y2 O
  5. {
    & \  }2 [0 P& E  j6 D; r% F- G
  6.     WSADATA wsaData;$ P9 T0 c( [6 X+ Y: h( H1 m
  7.     SOCKET sockClient;//客户端Socket
    & @$ {  `0 L5 W+ D" x6 s
  8.     SOCKADDR_IN addrServer;//服务端地址7 y0 k) Y1 a/ P2 o- d0 w2 C( g
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    ! h4 ~* b7 m/ [( O% b: `
  10.     char message[20] = "HelloSocket!";7 P( s1 `3 i. a" e( o1 D
  11.     //定义要连接的服务端地址: M6 C2 S! o0 x& H/ p! q3 W! B! x
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    8 g$ u( r! L3 ?% X
  13.     addrServer.sin_family = AF_INET;# q* V, J9 D* e6 G4 z' B. k
  14.     addrServer.sin_port = htons(6000);//连接端口6000' h) H$ H8 b, k. E2 a7 t: Y
  15.     //新建客户端socket
    ) }1 I& D3 z1 N: Z
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    0 h1 N* u1 W  e8 }
  17.     int s = 0;
    9 x" v$ P5 l( |2 @- D3 {+ U
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    1 O3 {/ z$ z. h4 _+ \
  19. : l# Y' [* c7 X8 w0 P8 h3 c
  20.     while (1){; B8 o! s2 v) {) Q
  21.         //发送数据( {+ M0 U4 r8 {: [2 _
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);/ K+ u) u2 d) K" W; ?
  23.         printf("to server:");, r. M3 m2 c2 c4 _, T
  24.         scanf("%s", message);
    ' q. a7 h% x6 ]$ `

  25. 7 M4 ^+ x! r0 a4 o
  26.     }
    ! G0 h" K( m  s- w9 }  @# a
  27.     //关闭socket2 @  C' m* o% S- M+ y/ c' P
  28.     closesocket(sockClient);
    0 w5 m6 T/ C# a; t8 G
  29.     WSACleanup();" l' q+ o$ f8 E( g
  30. }
复制代码
求懂的高手来解答一下。
* p* t8 p1 ], M" W7 j谢谢了!, k& o7 v3 e4 z- n; K4 G4 ~# [

: N/ y  I5 d- W. O
; g# N* y2 Q3 T+ v9 b! ?2 d
' L! W$ Y! D& I! L2 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为6 H# ?  I9 |0 _: o5 o0 J- P& Y# A; t
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-12-22 12:05 , Processed in 0.113519 second(s), 19 queries .

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