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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。1 |  d  ?+ O+ U9 ^0 R3 Q+ y8 E+ I
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。& N8 V- \. r- M: F9 {
Talk is cheak , show me the code.6 P9 D6 ]8 f) W/ m# n" ?% |
服务端代码:
) V  o- K5 ~& f/ k7 }8 s
  1. #include<stdlib.h>9 c, d" `9 J# y8 a+ y( m; H+ R
  2. #include<WinSock2.h>  S( \1 ^- z( ]) _# P5 }/ H0 x
  3. #pragma comment(lib,"ws2_32.lib")
    0 q& I# z3 a3 [3 O- c0 I8 e6 z$ T
  4. int main(){# E: T  `! L* V% [" k
  5.     WSADATA wsd;! r. t& p7 y4 o0 G
  6.     SOCKET sockServer;
    ; W+ H  P( K% p" S* X1 o# E3 v
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号7 |6 Y! k, T  n& W2 W
  8.     SOCKET sockClient;
      N0 z( ~) g% l) g( E1 ]8 W% [
  9.     SOCKADDR_IN clientaddr;
    3 S3 f" D9 E+ g/ N. R7 {- ~9 R; T6 z
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口: y  w/ |, N. J6 I6 k# e. x
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket! @. ?5 P  |9 v) v- X
  12. ! L% Q/ S$ ?9 y4 @
  13. * R. p+ ?- J- v6 @8 p' y
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    5 F2 [. L7 v$ b; w
  15.         printf("Socket has been created :%d", sockServer);/ d9 M7 z* N4 o) h/ p
  16.     }& I+ _3 J- f. P. k9 k% f. @
  17.     else{
    ' b' z; e9 |  R! o7 w
  18.         printf("Socket create failed.");
    4 d  O( \: `+ a6 u. T, c% T& s/ j
  19.         exit(0);) M5 q5 A( n- f% ?5 P0 ]
  20.     }% W' t: V" L+ Y7 R/ I. T: N; a
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);6 w( r4 W6 X' x6 H; y, u
  22.     serveraddr.sin_family = AF_INET;
    $ T( B& o  O: v4 R& l
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    $ S  z- L( D7 [- g' r' |% ^
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & ?# d2 j4 l4 h: a6 U& D
  25.     char recvBuf[100];
    ( _  e' G8 p5 Z9 {; O/ n4 w) h
  26.     int len = sizeof(SOCKADDR);1 a+ S& f$ `3 @3 i
  27.     listen(sockServer, 5);//5为等待连接数& \/ t# Q. g2 [
  28.     while (1){1 e# V# K) i9 }1 x& @  y
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);
    - ~. d; M3 H2 w! x9 Q/ V
  30.         //接收客户端数据2 g* Y) o- ~4 r! U) D- N; h
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);. v: ~. i8 f7 e7 q+ \, y
  32.         printf("to me:%s\n",recvBuf);( b, N0 f3 ~* y1 G& r* X
  33.         memset(recvBuf, 0, 100);
    : _4 R# K  }8 c1 j- L7 B4 x8 W
  34.     }
    . I3 L+ ~1 G# n1 |6 A! a$ `) p7 ^
  35.     closesocket(sockClient);
    / c/ o" `* H; c* c3 \5 e  @/ T% U
  36.     system("pause");# i6 i7 W! r3 d' h4 l+ r8 Z
  37.     return 0;
    $ o( h1 w& |3 ]3 k4 c! q* v
  38. }
复制代码
客户端代码:6 f: C. T4 v: f! k4 _4 w
  1. #include<winsock2.h>
    5 H; o8 K" S- n2 h! h. t4 k" D7 L# M
  2. #include<stdio.h>
    & i5 ^9 D2 h1 ~7 ~0 {; D) j1 g
  3. #pragma comment(lib, "ws2_32.lib")
    , K* Y  Y' q  n+ p& a
  4. void main()
    5 }4 P, _' N5 {. x- p
  5. {
    - r4 a  z- r4 q2 `8 ]
  6.     WSADATA wsaData;% X1 E/ U: }( q+ N+ }( ^3 E
  7.     SOCKET sockClient;//客户端Socket4 C" ^+ \* n3 |5 }# [2 v" S9 Y
  8.     SOCKADDR_IN addrServer;//服务端地址9 o1 x! X" f) @+ n& v, b
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);  p* n7 y3 V, k, p9 h4 x+ {
  10.     char message[20] = "HelloSocket!";
    , \+ y3 `( k! j, W' g3 ~6 A
  11.     //定义要连接的服务端地址* V1 P( z6 ^- U# S" B: n$ e1 J
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)
    & O6 _* B5 W! [
  13.     addrServer.sin_family = AF_INET;
    ! @  K- O9 H. B/ K0 z$ a9 d8 L! B
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    : `( h+ b  F- F! k5 _
  15.     //新建客户端socket
    - G$ D' Z  i6 s- J% W0 h
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 r0 j, E- L& O# u& F
  17.     int s = 0;" k/ E2 G8 T! }& U
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    5 ?+ `  Z$ p& Z& D$ S' ?- Y$ I

  19. 1 `* G! _2 _( L) L) v) j3 R# J
  20.     while (1){9 @7 I0 ?, O  v
  21.         //发送数据% K- E% T' f& q; F% i2 q
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. C# o+ e; m% F3 Y2 u" Y
  23.         printf("to server:");
    3 e7 b1 n* y; O* B% T9 h7 S
  24.         scanf("%s", message);: _, O0 e, e2 X/ S
  25. + c1 w. H( f( A$ @5 l6 W) ~  u$ D* \
  26.     }8 J' ]/ f8 M3 Y/ p0 I+ N
  27.     //关闭socket2 K8 `; t3 P3 f+ W$ e2 L; P# R
  28.     closesocket(sockClient);+ E+ |, i# M1 g
  29.     WSACleanup();, B2 X! |9 ^) g* c1 S) ]
  30. }
复制代码
求懂的高手来解答一下。. v5 ~1 ?, m9 u
谢谢了!
# f! x& l: m- z8 R: E

2 N$ K9 F$ ~4 b7 i8 B/ b5 L7 Y- B/ A$ G
' u! \7 [6 y% L; A8 r7 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为" s! x- _3 o. L6 B0 Y2 n% t
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2024-4-25 10:30 , Processed in 0.136173 second(s), 18 queries .

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