6.1.2Linux下Socket编程
tcp简单实验
server.c
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h> /*socket
* bind
* listen
* accept
* send/recv
*/ #define SERVER_PORT 8888
#define BACKLOG 10 int main(int argc, char **argv)
{
int iSocketServer;
int iSocketClient;
struct sockaddr_in tSocketServerAddr;
struct sockaddr_in tSocketClientAddr;
int iRet;
int iAddrLen; int iRecvLen;
unsigned char ucRecvBuf[1000]; //接收缓冲区 int iClientNum = -1; signal(SIGCHLD,SIG_IGN); //等待为子进程收尸信号 /* AF_INET为ipv4类型,SOCK_STREAM为Tcp连接类型,*/
iSocketServer = socket(AF_INET, SOCK_STREAM, 0); if( -1 == iSocketServer)
{
printf("socket error!\n");
return -1;
} tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net ,short */
tSocketServerAddr.sin_addr.s_addr = INADDR_ANY; /* 本机上的所有IP */
memset(tSocketServerAddr.sin_zero, 0, 8); /* 设置无用的空间为0 */
//配置本地信息iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
if( -1 == iRet)
{
printf("bind error!\n");
return -1;
}
//最大监听个数BACKLOG
iRet = listen(iSocketServer, BACKLOG);
if( -1 == iRet)
{
printf("listen error!\n");
return -1;
} while(1)
{
iAddrLen = sizeof(struct sockaddr);
iSocketClient = accept(iSocketServer, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
if (-1 != iSocketClient)
{
iClientNum++;
printf("Get connect from client %d : %s\n", iClientNum, inet_ntoa(tSocketClientAddr.sin_addr));
if(!fork())
{
/* 子进程的源码 */
while(1)
{
/* 接收客户端信息并打印出来 */
iRecvLen = recv(iSocketClient, ucRecvBuf, 999, 0);
if(iRecvLen <= 0)
{
close(iSocketClient);
return -1;
}
else
{
ucRecvBuf[iRecvLen] = '\0';
printf("Get Msg From Client %d: %s\n", iClientNum, ucRecvBuf);
}
}
}
}
} close(iSocketServer);
return 0;
}
client.c
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h> /*socket
* connet
* send/recv
*/
#define SERVER_PORT 8888 int main(int argc, char **argv)
{
int iSocketClient;
struct sockaddr_in tSocketServerAddr; int iRet;
unsigned char ucSendBuf[1000];
int iSendLen; if(argc != 2)
{
printf("Usage:\n");
printf("%s<server_ip>\n", argv[0]);
return -1;
} iSocketClient = socket(AF_INET, SOCK_STREAM, 0); tSocketServerAddr.sin_family = AF_INET;
tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net ,short */
if(0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr)) /* 本机上的所有IP */
{
printf("invalid server_ip\n");
return -1;
}
memset(tSocketServerAddr.sin_zero, 0, 8); /* 设置无用的空间为0 */ iRet = connect(iSocketClient, (struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr)); if(iRet == -1)
{
printf("connect error!\n");
return -1;
} while(1)
{
if(fgets(ucSendBuf, 999, stdin))
{
iSendLen = send(iSocketClient, ucSendBuf, strlen(ucSendBuf), 0);
if(iSendLen <= 0)
{
close(iSocketClient);
return -1;
}
}
} return 0;
}
6.1.2Linux下Socket编程的更多相关文章
- Linux下Socket编程的端口问题( Bind error: Address already in use )
Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- Linux下socket编程基本知识
本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linu ...
- linux下socket编程-进程间通信
一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket ...
- linux下socket编程
相关结构 //下边这两个结构定义在<sys/types.h>里 //一般的地址结构,只能用于覆盖(把其他地址转换为此类型),且只能引用该地址的sa_family字段 struct sock ...
- [转] - linux下socket编程实例
一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.socket也有一个类似于打开文件 ...
- 6.1.1Linux下Socket编程
什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...
- win32下Socket编程(转载)
在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:htt ...
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
随机推荐
- oracle 10g正则表达式 REGEXP_LIKE 用法
ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...
- centos JDK安装
第一步:查看Linux自带的JDK是否已安装 (卸载centOS已安装的1.4) 安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java versi ...
- D3.js 简介和安装
一.What´s D3.js D3.js是一种数据操作类型的javascript库(也可视其为插件):结合HTML,SVG和CSS,D3可以图形化的,生动的展现数据. D3 的全称是(Data-Dri ...
- jQuery UI 实例 - 对话框(Dialog)(zhuan)
http://www.runoob.com/jqueryui/example-dialog.html ************************************************* ...
- java static 关键字
static 修饰成员函数:(静态函数) 1)静态函数可以用类名和对象进行调用. 2)直接访问静态成员,但不能访问非静态成员变量. 3)非静态函数可以直接访问静态与非静态的成员.(非静态函数只能由对象 ...
- 如何使div左右倾斜
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" ...
- Directory.GetCurrentDirectory和Application.StartupPath的区别
System.IO.Directory.GetCurrentDirectory()方法用于获得应用程序当前工作目录.System.Windows.Forms.Application.StartupPa ...
- 3.3 使用Code First数据库迁移
当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常.一种解决方法是在Global.asax ...
- 10款实用Android UI 开发框架
1. ActionBarSherlock ActionBarSherlock是一个独立的Android设计库,可以让Android 2.x的系统也能使用ActionBar.此外,ActionBarSh ...
- HTML5自学笔记[ 18 ]canvas绘图基础5
获取图像数据:getImgData(x,y,w,h),返回的是一个ImageData对象,这个对象有三个属性保存图像信息:width/height/data.data是一个数组,保存了每个像素的信息, ...