C语言Socket编程(计算机网络作业)
最近我计算机网络课程要做作业了,没办法跟着老师一步一步的写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[];
int threadCount=; 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<=)
{
printf("please input program arguments ...\n");
exit();
}
if(argc> && argv[][]=='r')
{
printf("run receive ...\n");
Receive();
}
if(argc> && argv[][]=='s')
{
printf("run send ...\n");
Send();
}
} void* receiveWork(void * args)
{
SOCKET sc=accept(s,,);
if(sc==INVALID_SOCKET)
{
printf("sc Error");
}
creatThread(); printf("----------客户端已经连接到本机的%d线程连接!\n",threadCount-);
#define BUF_SIZE 4096
int receByt=;
while()
{
char buf[BUF_SIZE];
receByt=recv(sc,buf,BUF_SIZE,);
buf[receByt]='\0';
if(receByt>)
{
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(,),&wsd);
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
{
printf("socket created Error");
}
struct sockaddr_in ch;
memset(&ch,,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=INADDR_ANY;
ch.sin_port=htons();
int b=bind(s,(struct sockaddr *) &ch,sizeof(ch));
if(b==SOCKET_ERROR)
{
printf("bind 失败,出错代码是:%d\n",WSAGetLastError());
exit();
}
#define QUEUE_SIZE 5
int l=listen(s,QUEUE_SIZE);
printf("正在监听本机的1041端口!\n"); creatThread(); for(int i=;i<;i++)
{
pthread_join(t[i],NULL);
} int is=closesocket(s);
} void Send()
{
WSAData wsd;
WSAStartup(MAKEWORD(,),&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,,sizeof(ch));
ch.sin_family=AF_INET;
ch.sin_addr.s_addr=inet_addr("127.0.0.1");
ch.sin_port=htons(); int c=connect(s,(struct sockaddr *) &ch,sizeof(ch));
printf("已经连接到服务器的1041端口!现在可以向服务器发送消息了!\n");
#define BUF_SIZE 4096
char info[],buf[BUF_SIZE]; while()
{
gets(info);
if(info[]=='\0')
break;
strcpy(buf,info);
int nsend=send(s,buf,strlen(buf),);
}
int ic=closesocket(s);
}
C语言Socket编程(计算机网络作业)的更多相关文章
- 计算机网络|C语言Socket编程,实现两个程序间的通信
C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图
- C语言socket编程
建议先去看一下思路 真的写的很不错呦~ 思路参考博客:https://www.cnblogs.com/renfanzi/p/5713054.html linux c语言socket编程代码(单一服务端 ...
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
- C语言SOCKET编程指南
1.介绍 Socket 编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措? ...
- 多种语言socket编程集锦—win32
原文 http://www.blogjava.net/huyi2006/articles/263831.html 借此地方整理以下socket编程的多种语言的实现,socket可以跨平台的通信,因此多 ...
- C语言socket编程--每日签到
前几天写了个python的每日签到,你运行还得借助crontab,很是不爽.....正好前几天看了个关于c编写daemon进程,加上自己那点可怜的socket知识,于是我们重操旧页,C语言版的每日签到 ...
- C语言socket编程——linux环境
先写一个服务器端的监听程序,功能室从客户端读取字符,接收到后告知客户端“I got your message: ”+收到的消息:server.c #include <stdio.h> #i ...
- C语言socket编程----实现UDP通信
TCP/IP协议叫做传输控制/网际协议,又叫做网络通信协议.实际上,它包括上百个功能的协议. 套接字(socket):在网络中用来描述计算机中不同程序与其他计算程序的通信方式. 套接字分为三类; 流式 ...
- C语言socket编程----struct sockaddr 和struct sockaddr_in介绍和初始化
sockaddr结构体 struct sockaddr{ sa_family_t sa_family; //地址族,最常用的是"AF_INET"(IPV4)和"AF_ ...
随机推荐
- docker 容器目录挂载 | 进出容器
docker run --name wnginx -d -p 9001:80 -v /home/www:/usr/share/nginx/html nginx --name 别名 -d ...
- javascript-高级用法
22.1 安全的类型检测 为什么:typeof 不靠谱, 无法将数组从对象中区分出来, instanceof 有特殊情况,在iframe存在的情况下无法判断另一个iframe内的数组 如何做:Obje ...
- Exception.StackTrace
Exception中的StackTrace属性 执行堆栈跟踪在给定时刻正在执行的所有方法. 对方法调用的跟踪称为堆栈跟踪. 堆栈跟踪列表提供了一种循着调用堆叠跟踪到方法中异常发生处行号的手段.Stac ...
- POJ 1159 Palindrome(最长公共子序列)
http://poj.org/problem?id=1159 题意: 给出一个字符串,计算最少要插入多少个字符可以使得该串变为回文串. 思路: 计算出最长公共子序列,再用原长-LCS=所要添加的字符数 ...
- Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同
算法分析:这道题很简单,利用递归即可. public class SameTree { public boolean isSameTree(TreeNode p, TreeNode q) { if(p ...
- vim 安装Vundle.vim
1.下载 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 2.配置vimrc set no ...
- 经典线程同步问题(生产者&消费者)--Java实现
生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费. 为使生产者与消费者之间能够并发执行,在两 ...
- 【Python】使用Pytest集成Allure生成漂亮的图形测试报告
前言 大概两个月前写过一篇<[测试设计]使用jenkins 插件Allure生成漂亮的自动化测试报告>的博客,但是其实Allure首先是一个可以独立运行的测试报告生成框架,然后才有了Jen ...
- angular项目一
1.Angularjs第三方模块angular-route和angular-ui-router的区别.差异.不同, ui-router路由器是一个第三方模块,功能非常强大.它支持一切正常ngroute ...
- 递推-练习2--noi3525:上台阶
递推-练习2--noi3525:上台阶 一.心得 二.题目 3525:上台阶 总时间限制: 1000ms 内存限制: 65536kB 描述 楼梯有n(100 > n > 0)阶台阶,上 ...