linux下简易socket编程
2015-09-11 12:35
721 查看
最近研究了一下linux下的socket编程。这里写一个简易的版本上去。主要是分client和server两个部分。
对于client比较简单,这里仅做一个简单的client。可以给自己的server发送一条消息并且可以得到一条服务器返回的消息,之后结束进程。
#include
#include
#include
#include
#include
#include
#define MAXNUM 255
#define BINDPORT 8000
int main(int argc, char** argv)
{
int iSocketFd;
int iRecvLen; //用来获取返回的字符串长度
char cRecvMsg[MAXNUM]; //用来获取由服务器传来的信息
char cSendMsg[MAXNUM];
struct sockaddr_in Saddr;
if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket init error");
exit(0);
}
memset(&Saddr, 0, sizeof(Saddr));
Saddr.sin_family = AF_INET; //代表用的ipv4协议
Saddr.sin_port = htons(BINDPORT);
//用来获取主机server的IP地址
if(inet_pton(AF_INET, argv[1], &Saddr.sin_addr) <= 0)
{
printf("inet_pton error");
exit(0);
}
if(connect(iSocketFd, (struct sockaddr*) &Saddr, sizeof(Saddr)) < 0)
{
printf("connect error");
exit(0);
}
//读取一行作为传送给server的信息
fgets(cSendMsg, MAXNUM, stdin);
if(send(iSocketFd, cSendMsg, strlen(cSendMsg), 0) < 0)
{
printf("send error");
exit(0);
}
if((iRecvLen = recv(iSocketFd, cRecvMsg, MAXNUM, 0)) < 0)
{
printf("receive error");
exit(0);
}
cRecvMsg[iRecvLen] = '\0'; //将收到的信息末端添加\0以便输出。
printf("received:%s", cRecvMsg);
close(iSocketFd);
return 0;
}
对于server。中间采用了调用子进程来进行收发消息的机制,这样如果扩展可以用来并发的接待多位client.
基本就是这样。
对于client比较简单,这里仅做一个简单的client。可以给自己的server发送一条消息并且可以得到一条服务器返回的消息,之后结束进程。
#include
#include
#include
#include
#include
#include
#define MAXNUM 255
#define BINDPORT 8000
int main(int argc, char** argv)
{
int iSocketFd;
int iRecvLen; //用来获取返回的字符串长度
char cRecvMsg[MAXNUM]; //用来获取由服务器传来的信息
char cSendMsg[MAXNUM];
struct sockaddr_in Saddr;
if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("socket init error");
exit(0);
}
memset(&Saddr, 0, sizeof(Saddr));
Saddr.sin_family = AF_INET; //代表用的ipv4协议
Saddr.sin_port = htons(BINDPORT);
//用来获取主机server的IP地址
if(inet_pton(AF_INET, argv[1], &Saddr.sin_addr) <= 0)
{
printf("inet_pton error");
exit(0);
}
if(connect(iSocketFd, (struct sockaddr*) &Saddr, sizeof(Saddr)) < 0)
{
printf("connect error");
exit(0);
}
//读取一行作为传送给server的信息
fgets(cSendMsg, MAXNUM, stdin);
if(send(iSocketFd, cSendMsg, strlen(cSendMsg), 0) < 0)
{
printf("send error");
exit(0);
}
if((iRecvLen = recv(iSocketFd, cRecvMsg, MAXNUM, 0)) < 0)
{
printf("receive error");
exit(0);
}
cRecvMsg[iRecvLen] = '\0'; //将收到的信息末端添加\0以便输出。
printf("received:%s", cRecvMsg);
close(iSocketFd);
return 0;
}
对于server。中间采用了调用子进程来进行收发消息的机制,这样如果扩展可以用来并发的接待多位client.
#include #include #include #include #include #include #include #include #define BINDPORT 8000 int handleMsg(int iConnectFd); int main(int argc, char ** argv) { int iSocketFd, iConnectFd; struct sockaddr_in Saddr; char cServerAns[40] = "Server received Msg"; char cMsg[255]; pid_t pid; if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("create socket error"); exit(0); } memset(&Saddr, 0, sizeof(Saddr)); Saddr.sin_family = AF_INET; Saddr.sin_addr.s_addr = htonl(INADDR_ANY); Saddr.sin_port = htons(BINDPORT); if(bind(iSocketFd, (struct sockaddr*)&Saddr, sizeof(Saddr)) < 0) { printf("bind error"); } if(listen(iSocketFd, 10) < 0) { printf("listen socket error"); exit(0); } while(true) { if((iConnectFd = accept(iSocketFd, (struct sockaddr*)NULL, NULL)) < 0) { printf("accept socket error"); } pid = fork(); if(pid < 0) { printf("fork error"); exit(0); } else if(pid == 0) //调用子进程进行收发信息 { handleMsg(iConnect_fd); close(iConnectFd); } else if(pid > 0) { close(iConnectFd); } } close(iSocketFd); } int handleMsg(int iConnectFd) { char cTime[255]; char cRecvMsg[255]; int iRecvLen; int iMsgLen; time_t now; iRecvLen = recv(iConnectFd, cRecvMsg, 255,0); cRecvMsg[iRecvLen] = '\0'; now = time(0); strftime(cTime, 255, "%Y.%m.%d_%H:%M:%S", localtime(&now)); printf("%s %d %s", cTime, getpid(), cRecvMsg); //打印当前时间 子进程号 收到的信息 if(send(iConnectFd, "you are connected!\n", 19, 0) < 0) { printf("send error"); exit(0); } }
基本就是这样。
相关文章推荐
- Linux下软件常见安装方式
- 如何更改linux文件的拥有者及用户组(chown和chgrp)--- chown root:root testfile // 使用 chown 一次性修改拥有者及组
- 第二天半:VMware和centos的安装 (补昨天)
- php和bom头的冤仇 和 如何在linux下使用命令去掉bom头
- Linux系统中的切换用户命令宝典
- 在linux上格式化U 盘
- Spotlight on Unix 监控Linux服务器
- Linux c 源码(issockettype:套接字描述符判定函数)
- Windows与Linux之间的文件传输工作WinSCP的使用
- 常用linux命令
- linux查看文件有多少行
- window主机访问Linux主机通过samba服务共享的目录 和Linux主机挂载window主机共享目录到本地
- CentOS 7 安装 Gitlab
- linux系统管理-软件包管理
- linuxJDK配置
- Linux系统库函数 -- lseek函数用法
- 动态库和Linux调试技术
- 用命令形式从Windows系统拷贝文件到Linux
- 重装系统时断电或强制关机导致硬盘故障的解决
- Linux删除重复行的命令