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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。
* ^, S. J  v4 X+ m我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。
- f; i) ?! j1 Q3 \& _/ fTalk is cheak , show me the code.
* P: _2 k9 l* z1 T# K7 {服务端代码:- a3 _3 S% E/ {2 A
  1. #include<stdlib.h>6 D* P0 Z& X9 @9 ^0 }3 K( ]  ?
  2. #include<WinSock2.h>* n* D- b- |) g) h% {" l
  3. #pragma comment(lib,"ws2_32.lib")  C8 q* o$ A; k) Y0 x
  4. int main(){1 G! m% [9 @' Q
  5.     WSADATA wsd;
    7 w& r  b4 }; J$ p/ I4 }# J5 H
  6.     SOCKET sockServer;! m! M0 a% D3 ?5 S
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
      i, Q6 @, l2 f8 O% k4 ?8 r$ h5 V
  8.     SOCKET sockClient;
    $ d. _* j0 r/ R  S
  9.     SOCKADDR_IN clientaddr;+ H) b" q0 G1 b: s! c0 T/ ^
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口6 t& }4 r) R. [9 Q/ L
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket1 r0 O& W& v3 T5 x5 b! k) K$ K' |

  12. : b8 w$ K  W# O0 j9 I& J9 a5 P
  13.   @) i; z5 }9 `$ `; |! c
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){/ M: ~1 F/ a$ D4 J' M- E1 k
  15.         printf("Socket has been created :%d", sockServer);$ @) _$ U" M& W$ ?
  16.     }4 O; |) t: a: c" s( n
  17.     else{0 R/ g/ K% V; d$ @, @3 D
  18.         printf("Socket create failed.");
    + j2 S: t$ A% H% u0 P3 d
  19.         exit(0);
    & R1 ~% F& f3 @& y# p* T
  20.     }9 X: P: Z0 s+ Z5 M% G# d
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);1 _/ D1 J. i  m; S- I# o* a
  22.     serveraddr.sin_family = AF_INET;2 W9 B" ~2 [2 _
  23.     serveraddr.sin_port = htons(6000);//绑定端口60000 a$ x/ E6 a' n9 c
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    & z) x, o2 b) ]  g: l
  25.     char recvBuf[100];( x! N* s; ~2 q7 ^2 s
  26.     int len = sizeof(SOCKADDR);
    " L( w! U! x3 W
  27.     listen(sockServer, 5);//5为等待连接数
    7 r( f: ^1 Z. w
  28.     while (1){
    + a$ Z+ x; w( P& ^4 V) t, V7 I' c( _. R
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);* S' B" V9 G* U0 p- a
  30.         //接收客户端数据
    3 z  e2 ?$ w4 z1 y
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);8 q0 _8 `% s5 P( r% z: E4 j
  32.         printf("to me:%s\n",recvBuf);
    " r' g: _# a: k/ z
  33.         memset(recvBuf, 0, 100);
    0 j. k) R& x, R( H8 k7 v1 Q
  34.     }$ V' Y  I) Q8 }0 k% K0 o1 v
  35.     closesocket(sockClient);, m# E0 Q: y; _. ]
  36.     system("pause");# [/ t! P3 z% n: F) M
  37.     return 0;
    & h  d( P6 i  I* K  [* a# z
  38. }
复制代码
客户端代码:0 D" g' ]! q$ @: b3 S
  1. #include<winsock2.h>
    : ~/ a; R* d+ ~) d4 X& P. Q
  2. #include<stdio.h>
      `' B+ r! Z0 Z: r. B2 h' B: a
  3. #pragma comment(lib, "ws2_32.lib")) ]. a7 [$ c$ k, a
  4. void main()
    7 t) P- C2 R% |4 V/ l/ M
  5. {' a" d) L+ j  p0 e
  6.     WSADATA wsaData;
    3 f, N- Z6 m. A" E+ i/ f% C. X
  7.     SOCKET sockClient;//客户端Socket
    9 @# P3 b& f6 K
  8.     SOCKADDR_IN addrServer;//服务端地址" V8 w5 U% N% y
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);
    % J9 Q3 U7 V8 {* i+ M2 U. ~2 h1 i7 o
  10.     char message[20] = "HelloSocket!";; `3 p0 A4 C6 p: a% T
  11.     //定义要连接的服务端地址
    4 K* w7 ]. A. A# r- s9 F
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址)  p/ v$ U5 m" N  q. C3 U9 l
  13.     addrServer.sin_family = AF_INET;
    $ w2 ]  S9 z+ f% N, P- v( k9 j" P
  14.     addrServer.sin_port = htons(6000);//连接端口6000. F/ t4 a5 A- m1 S, W! {
  15.     //新建客户端socket
    ' H. t. W# w, X$ Z" v6 }( I. ]) m
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& e# j* Y% }& _; }7 r4 k! e' O
  17.     int s = 0;7 H! f9 ]/ y# X# I& y9 Y8 I$ o
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    ( u! V2 w  \( e0 k
  19. / b6 x' V$ q4 z/ a0 }$ ^7 G1 V
  20.     while (1){
    8 _9 Y+ q2 ~) v" S$ x5 r9 ~
  21.         //发送数据
    & c4 Q; O7 \$ ^; y7 B+ r4 |. c7 i* T
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);9 A& T, r. T# v9 W2 w- c
  23.         printf("to server:");9 E4 J5 a9 w6 u' \
  24.         scanf("%s", message);
    ( l) n" C! h! L) Y2 i
  25. ; k6 S) l8 x6 Y8 n- J" L+ D
  26.     }) x! o+ m( T" u3 F0 A
  27.     //关闭socket
    8 M' j0 ^9 k) o
  28.     closesocket(sockClient);
    ) o5 u+ i. k. a5 g
  29.     WSACleanup();% I* j* d( F) W- l3 {: a. m7 C
  30. }
复制代码
求懂的高手来解答一下。
: Y% P5 S+ D! z+ ^谢谢了!$ S" s+ _3 L! X3 N, c. W

+ L- ~+ m/ Z6 }' p1 X
9 E( }3 G0 H- Q: p
/ W1 B/ I) I- S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为
5 b6 f4 l9 U9 M- jrecv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-3-16 16:45 , Processed in 0.054022 second(s), 19 queries .

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