最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写C语言的代码,使用的计算就是Socket通信发送消息;代码实现的功能很简单,客户端向服务器端发送消息,服务器端接收客户端发来的消息,并且输出显示到屏幕上;代码中的每个socket方法的返回值都应该做判断出错情况,例如:创建SOCKET的创建的时候s句柄(或对象),需要判断返回值是否为INVALID_SOCKET,以及socket的所有操作的返回值是否为SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码。

老师是录制的视频讲解的,其他其中使用的到的方法要求我们自己去查相关的MSDN资料库,如果有不懂的,就自己上网查。

服务器端接收代码:

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>

void main()
{
WSAData wsd;
WSAStartup(MAKEWORD(2,0),&wsd);

SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in ch;
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=INADDR_ANY;
ch.sin_port=htons(1041);
int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
#define QUEUE_SIZE 5
int l=listen(s,QUEUE_SIZE);
printf("正在监听本机的1041端口!\n");
SOCKET sc=accept(s,0,0);
printf("客户端已经连接到本机的1041端口!\n");
#define BUF_SIZE 4096
int receByt=0;
while(1)
{
char buf[BUF_SIZE];
receByt=recv(sc,buf,BUF_SIZE,0);
buf[receByt]='\0';
if(receByt>0)
{
printf("接收的消息是:%s\n",buf);
}
else
{
printf("接收消息结束!");
break;
}

}
int ic=closesocket(sc);
int is=closesocket(s);

}

======================================================
客户端发送的代码:

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>
#include <string.h>

void main()
{
WSAData wsd;
WSAStartup(MAKEWORD(2,0),&wsd);

SOCKET s =NULL;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
struct sockaddr_in ch;
memset(&ch,0,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=inet_addr("127.0.0.1");
ch.sin_port=htons(1041);

int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!\n");
#define BUF_SIZE 4096
char info[1024],buf[BUF_SIZE];

while(1)
{
gets(info);
if(info[0]=='\0')
break;
strcpy(buf,info);
int nsend=send(s,buf,strlen(buf),0);

}
int ic=closesocket(s);
}

========================================================================

程序代码经过了优化,并且整合多线程,把接收和发送放到同一个文件中,使用参数模式调用发送和接收模块。增加了创建SOCKET的创建的时候s句柄(或对象)判断返回值是否为INVALID_SOCKET,以及socket的bind操作的返回值是否为SOCKET_ERROR,其他socket的操作应该也判断SOCKET_ERROR,以保证程序的稳定性,这里只是测试代码就不去写这么多了,剩下的就由你个人发挥。

#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <pthread.h>void Receive();
void Send();
void creatThread();SOCKET s =NULL;
pthread_t t[1000];
int threadCount=0;void main(int argc,char* argv[])
{printf("本程序制作人学号:713901040041\n");printf("程序说明:服务器端和客户端为同一个程序,请使用不同的参数运行.\n");printf("接收程序请使用 r参数;发送程序请使用 s参数。\n");//printf("len : %d\n", argc);//printf("count %d\n",argc);//printf("value: %s\n",argv[1]);//printf("%d",argv[1][0]=='r');if(argc<=1){printf("please input program arguments ...\n");exit(0);}if(argc>1 && argv[1][0]=='r'){printf("run receive ...\n");Receive();}if(argc>1 && argv[1][0]=='s'){printf("run send ...\n");Send();}
}void* receiveWork(void * args)
{SOCKET sc=accept(s,0,0);if(sc==INVALID_SOCKET){printf("sc Error");}creatThread();printf("----------客户端已经连接到本机的%d线程连接!\n",threadCount-2);
#define BUF_SIZE 4096int receByt=0;while(1){char buf[BUF_SIZE];receByt=recv(sc,buf,BUF_SIZE,0);buf[receByt]='\0';if(receByt>0){printf("线程接收的消息是:%s\n",buf);}else{printf("客户端已退出,");break;}}int ic=closesocket(sc);printf("服务器结束连接!\n");return NULL;
}void creatThread()
{pthread_create(&t[threadCount++],NULL,receiveWork,NULL);
}void Receive()
{WSAData wsd;WSAStartup(MAKEWORD(2,0),&wsd);    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(s==INVALID_SOCKET){printf("socket created Error");}struct sockaddr_in ch;memset(&ch,0,sizeof(ch));ch.sin_family=AF_INET;ch.sin_addr.s_addr=INADDR_ANY;ch.sin_port=htons(1041);int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));if(b==SOCKET_ERROR){printf("bind 失败,出错代码是:%d\n",WSAGetLastError());exit(0);}
#define QUEUE_SIZE 5int l=listen(s,QUEUE_SIZE);printf("正在监听本机的1041端口!\n");creatThread();for(int i=0;i<1000;i++){pthread_join(t[i],NULL);}int is=closesocket(s);
}void Send()
{WSAData wsd;WSAStartup(MAKEWORD(2,0),&wsd);SOCKET s =NULL;s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(s==INVALID_SOCKET){printf("socket created Error");}struct sockaddr_in ch;memset(&ch,0,sizeof(ch));ch.sin_family=AF_INET;ch.sin_addr.s_addr=inet_addr("127.0.0.1");ch.sin_port=htons(1041);int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!\n");
#define BUF_SIZE 4096char info[1024],buf[BUF_SIZE];while(1){gets(info);if(info[0]=='\0')break;strcpy(buf,info);int nsend=send(s,buf,strlen(buf),0);}int ic=closesocket(s);
}

C语言Socket编程(计算机网络作业)相关推荐

  1. C语言 socket编程实例

    C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...

  2. c语言soket编程,C语言socket编程使用方法

    C语言socket编程使用方法 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言.以 ...

  3. C语言SOCKET编程指南

    转载自:http://blog.sina.com.cn/s/blog_79b01f66010163q3.html 这篇文章完全可以作为c语言socket编程指南,无论在任何系统下.感谢作者fenglo ...

  4. go语言socket编程

    go语言socket编程 用go写socket非常简单,如果你了解其他语言的socket的话一看便知,如果想深入的话,个人建议看uninx网络编程套接字联网API这本书. 在go中,网络协议被封装的非 ...

  5. 钻星图的c语言的编程,C 语言Socket编程教程 pdf

    南漳谬悠情节层析德雅青豆丹佛脉理密封.夺理秋月弹流清切壳菜夺得沙梨.临朐硕壮着迷僚婿母权欣欣气急波器,倒把迟迟供肥东辽电学片盘挂钟劈胸麦片!龙乡足板比美性病内屏:涣然树立马具闹哄啪唧每场水力儒艮: 励 ...

  6. 【go语言 socket编程系列】net.DialTCP、net.DIalUDP与net.Dial

    [函数原型] func DialTCP(network string, laddr, raddr *TCPAddr) (*TCPConn, error)  func DialUDP(network s ...

  7. C语言Socket编程为什么要将sockaddr_in强制转换成sockaddr?

    在阅读尹圣雨<TCP/IP网络编程>(C语言示例)的时候,看到将sockaddr_in类型的struct的指针强制转换成了sockaddr类型的指针. 比如hello_client.c: ...

  8. 计算机网络实验 socket编程,计算机网络实验 socket编程

    实验三 socket套接字编程实验 一.Sockets编程基础知识 网络编程就是通过计算机网络与其他程序进行通信的程序,Socket编程是网络编程的主流工具. Socket API是实现进程间通信的一 ...

  9. 计算机网络实验socket编程,计算机网络实验 socket编程

    使用连接.终止连接的过程.在数据传输过程中,各数据分组不携带目的地址,而使用连接号(connect ID ).从本质上看,连接是一个管道,收发数据不但顺序一致,而且内容相同. Socket 编程中,双 ...

  10. linux C语言 socket编程教程(附两个例子)(socket教程)

    文章目录 1.网络中进程之间如何通信? 2.什么是Socket? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 网络字节序与主机字节序 3.3.listen(). ...

最新文章

  1. 疑难杂症——bash: /dev/null: Permission denied
  2. 在myeclipse文件中如何创建properties类型的文件,从而连接数据库
  3. 酷炫Jquery收集
  4. 文巾解题 525. 连续数组
  5. Python3之字符串格式化format函数详解(下)
  6. element-ui中table表头错位问题
  7. C++:二维数组和二维向量的长度
  8. 深度学习(五十一)变分贝叶斯自编码器(上)
  9. vue 组件 props配置
  10. 超频,如何超频CPU和显卡?
  11. mysql select string,MySql查询在select中用空stringreplaceNULL
  12. 2020 年开源项目
  13. 输出IMG格式SAR图像——Img格式图像文件概述
  14. Bex5开发平台分辨率问题解决方法
  15. tbschedule源码分析配置
  16. java前后端分离使用token_前后端分离以及token的使用
  17. Sketchup2019安装包安装教程
  18. Android开发之中文语音朗读
  19. 2019软科【世界一流计算机学科排名】公布!
  20. linux usb挂载日志,linux系统usb挂载

热门文章

  1. [转载]共享软件的注册加密法
  2. ProxyToken:微软 Exchange 服务器中的认证绕过新漏洞,可窃取用户邮件
  3. DBA主宰一切请求,MySQL 查询重写
  4. vue 监听state 任意值变化、监听mutations actions
  5. Gym 101206L Daylight Saving Time 根据年月日计算星期
  6. 完全备份、差异备份以及增量备份的区别
  7. 根据中心点、半径长度和角度画点
  8. 使用FileReader对象的readAsDataURL方法来读取图像文件
  9. Freescale i.mx28 Boot-stream分析
  10. [转载] 基于约束放松的自适应Web服务选取方法的研究