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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-5-9 02:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,感谢你的回复。- u# ]5 X, V( G5 N3 G5 a& E
我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。: \  Q1 H1 Y  ?/ ~, C3 _8 H
Talk is cheak , show me the code.% j$ i  Y* N( j. i" U; D
服务端代码:6 p0 Q5 l7 d, e* _3 N2 w4 W  W. T
  1. #include<stdlib.h>7 m1 B) e# W" Y6 N6 k
  2. #include<WinSock2.h>
    ; c( A8 R- [* r8 Q: ]  @
  3. #pragma comment(lib,"ws2_32.lib")) a* u4 Z0 _6 l& p+ ]
  4. int main(){# J" R0 _/ _% n! d6 p
  5.     WSADATA wsd;
    * G+ _4 Q( z% A
  6.     SOCKET sockServer;
    1 [1 E9 [# B$ ~" q) o
  7.     SOCKADDR_IN serveraddr;// 服务端套接字   该结构中包含了要结合的地址和端口号
    + q2 D5 E2 x; b; I) ~1 c
  8.     SOCKET sockClient;
    + v0 _' E& f9 \2 n1 n
  9.     SOCKADDR_IN clientaddr;$ L6 H( C( Q5 @5 M, Y# n! H5 F6 O3 Z, n
  10.     WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口
    0 e0 W# |3 S; x5 T7 ^+ h- Q( _
  11.     sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket
    / t2 `" h! c2 D5 A5 `6 W2 W

  12. $ p- Q; N. a/ M' w3 W

  13. " ~" n+ W! M5 P1 l- N$ H0 o% x
  14.     if (sockServer != -1 && sockServer != INVALID_SOCKET){
    ! b; O( ^( P( V4 B) A' j9 s* b( s, m( g
  15.         printf("Socket has been created :%d", sockServer);& `, N5 N/ s0 x4 P! ^5 E' }
  16.     }; T- ~0 p# \, k
  17.     else{
    ) C) B' b; q) `- Z
  18.         printf("Socket create failed.");* j9 k2 J% ^$ i% ^0 [
  19.         exit(0);
    8 I4 |% K9 c2 F. J1 l$ z, q- n, Z+ ^6 ?
  20.     }
    & J* R% k4 n" Q
  21.     serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    ! X: U3 i# B+ Z; _
  22.     serveraddr.sin_family = AF_INET;
    ) N) s& c/ h, `2 q
  23.     serveraddr.sin_port = htons(6000);//绑定端口6000
    & m# Q4 h: p: l4 Z/ z- i
  24.     int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR));
    : g9 U9 |' l) Q
  25.     char recvBuf[100];
    - q" b  ^% A% }
  26.     int len = sizeof(SOCKADDR);, \: U/ d/ A/ ]9 l; x% G+ m6 A
  27.     listen(sockServer, 5);//5为等待连接数  j2 M1 n5 I/ {7 y% R
  28.     while (1){
    9 \. z- ^. e0 L- ?
  29.         sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len);+ w: Q  r: s! }) `" F$ X
  30.         //接收客户端数据/ Z* F% \8 V+ B- Z6 {0 H
  31.         recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK);
      C2 L. A+ e  F6 L6 S( L+ k! s
  32.         printf("to me:%s\n",recvBuf);
    : s. h3 D; X- S: j
  33.         memset(recvBuf, 0, 100);
    ) U6 Z) m$ \! M% w" g
  34.     }* ^2 ~# u$ _1 B; ?5 Z4 M# G, P9 p7 o
  35.     closesocket(sockClient);
    . Q' O+ V+ B4 |* I
  36.     system("pause");* z, _2 O5 d% g) m& V/ v
  37.     return 0;
    3 i" J$ C9 }- i- t
  38. }
复制代码
客户端代码:
' F/ J. u9 n& V: f4 R. E. [7 F/ X$ P
  1. #include<winsock2.h>
    1 \& h8 U8 j  q5 z
  2. #include<stdio.h>+ S+ r+ N5 |% T+ W% M9 h5 g
  3. #pragma comment(lib, "ws2_32.lib")
    ; S, w+ e* s3 K! M& r
  4. void main()
    2 u( M) I+ m. i! v4 p8 A2 W
  5. {
    ' j3 R. R' V! {4 O2 W( @$ Y! R
  6.     WSADATA wsaData;
    ) {/ `$ o% Z2 ~/ U* v' s
  7.     SOCKET sockClient;//客户端Socket
    5 c# G3 d! E1 a3 ~
  8.     SOCKADDR_IN addrServer;//服务端地址! P+ ^) @2 l8 n3 h& n* K4 V* X
  9.     WSAStartup(MAKEWORD(2, 2), &wsaData);1 d$ a2 c4 D. T$ L* e
  10.     char message[20] = "HelloSocket!";" {8 {' I+ v/ _; \# Z0 N% K& v
  11.     //定义要连接的服务端地址5 O  {; j" E2 O* u% v
  12.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址), f1 M# r% q) S1 J& X
  13.     addrServer.sin_family = AF_INET;
    : j) ]% R5 m* T# H6 v+ C
  14.     addrServer.sin_port = htons(6000);//连接端口6000
    : t7 p" n$ A+ B! i
  15.     //新建客户端socket
    % Y6 I- y  F2 B
  16.     sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    7 L5 }* t1 T7 c; D
  17.     int s = 0;. ~8 Y+ D  l6 B, _7 Y) {' @
  18.     s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));  B- f! V% B; w5 P2 r' D9 d
  19. : `# R2 \' ^7 G( A% d5 D* |) G
  20.     while (1){
    0 z3 Z; n8 g& t) [
  21.         //发送数据
    2 Y* `8 h8 F7 O1 P
  22.         int a = send(sockClient, message, strlen(message) + 1, 0);. C! i# P" I8 s& |
  23.         printf("to server:");
    $ V) y$ A1 S$ l8 d
  24.         scanf("%s", message);2 H' h0 y( F0 G) D

  25. + N) @+ h6 `' E8 |2 a
  26.     }6 B* Q% f9 Z7 h2 N- x
  27.     //关闭socket9 q1 M! H4 ?8 S+ q5 R0 K
  28.     closesocket(sockClient);
    + L; c/ e4 \2 |
  29.     WSACleanup();
    7 R$ P0 U3 J) G$ r0 }9 [
  30. }
复制代码
求懂的高手来解答一下。
' v1 X, U6 P+ y6 i2 ]) r  k谢谢了!
8 U' ^5 E" h1 |# P9 S

* W" z% @' q' q% M) ?% g9 J  a
% Q# _7 X4 \1 w5 P4 t$ ]8 x! S: h) U& r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
沙发
 楼主| 发表于 2020-5-9 02:33:06 | 只看该作者
应该用多线程或者多进程,,,过两天给你源代码
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2020-5-9 02:33:20 | 只看该作者
我已找到原因了, recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); 这句改为2 B0 v9 q8 R3 B' s
recv(sockClient, recvBuf, strlen(recvBuf)+1, 0); 就OK了
回复 支持 反对

使用道具 举报

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

本版积分规则

GMT+8, 2026-1-30 13:02 , Processed in 0.048848 second(s), 18 queries .

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