open_clientfd(char* hostname,int port)和open_listenfd(int port)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/wait.h> typedef struct sockaddr SA; int open_clientfd(char* hostname,int port)
{
int clientfd;
struct hostent * hp;
struct sockaddr_in serveraddr;
char* msg; /*创建socket*/
if((clientfd=socket(AF_INET,SOCK_STREAM,))<)
{
msg="client socket() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client socket() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*填写server的ip地址和port*/
if((hp=gethostbyname(hostname))==NULL)
{
msg="client gethostbyname() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client gethostbyname() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(port);
bcopy((char*)hp->h_addr_list[],(char*)&serveraddr.sin_addr.s_addr,hp->h_length); /*建立连接*/
if(connect(clientfd,(SA*)&serveraddr,sizeof(serveraddr))<)
{
msg="client connect() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="client connect() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); return clientfd;
} int open_listenfd(int port)
{
int listenfd,optval;
struct sockaddr_in serveraddr;
char* msg; /*创建socket*/
if((listenfd=socket(AF_INET,SOCK_STREAM,))<)
{
msg="server socket() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server socket() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*配置服务器使得它能被立即终止和重启*/
if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const void *)&optval,sizeof(int))<)
{
msg="server setsockopt() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server setsockopt() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*绑定服务端的ip和端口*/
bzero((char*)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons((unsigned short)port);
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(listenfd,(SA*)&serveraddr,sizeof(serveraddr))<)
{
msg="server bind() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server bind() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); /*创建listen*/
if(listen(listenfd,)<)
{
msg="server listen() error!\n";
write(STDOUT_FILENO,msg,strlen(msg));
return -;
}
msg="server listen() success!\n";
write(STDOUT_FILENO,msg,strlen(msg)); return listenfd;
}
open_clientfd(char* hostname,int port)和open_listenfd(int port)的更多相关文章
- java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)
java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...
- const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * ...
- C++中int *p[4]和 int (*q)[4]的区别
这俩兄弟长得实在太像,以至于经常让人混淆.然而细心领会和甄别就会发现它们大有不同. 前者是指针数组,后者是指向数组的指针.更详细地说. 前: 指针数组;是一个元素全为指针的数组.后: 数组指针;可以直 ...
- C++中(int&)和(int)的区别
在说这个问题之前,先说两个需要知道的背景知识: (1)语言的类型的强制转换不会修改原来的数据,会另外的开辟一个临时的或者程序中指定的空间来存储强制转换后的值. (2)C++引用的实现是在符号表中动了手 ...
- 将int转int数组并将int数组元素处理后转int,实现加密
package faceobject; import java.util.Arrays; public class Test { /** 加密问题 数据是小于8位的整数 先将数据倒序,然后将每位数字都 ...
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...
- C语言复杂声明-void (*signal(int sig, void (*handler)(int)))(int);
问题提出 请分析此声明:void (*signal(int sig, void (*handler)(int)))(int); 求解过程 在对上面的例子作分析之前,我们需要了解C语言的声明优先级,&l ...
- 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud
package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...
- (int &)a 和(int)a
[cpp] view plain copy float a = 1.0f; cout < < (int)a < < endl; cout < < ...
随机推荐
- 动态创建组件TEdit
//动态创建组件TEdit procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftSt ...
- DataPackage-数据库、表的区域设置和系统不一致导致处理失败
问题描述: 最近学习Datapackage,创建完之后,部署处理但总是提示某某字段的区域设置和目标字段的区域设置不一致,具体如图: 测试发现其它的数据库表又没有这类 ...
- strassen algorithm
the explaination that is clear in my view is from wiki.
- Helpers\Pagination
Helpers\Pagination Break recordset into a series of pages. First create a new instance of the class ...
- 如何在 PHP 中处理 Protocol Buffers 数据
Protocol Buffers是谷歌定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高 ...
- 关于删除linux多余内核
step 1: 查找当前正在使用的内核文件的版本号 #uname -r step 2: 列出所有的内核文件,使用rpm 或者 dpkg(基于linux系统) 命令 #rpm -q kernel 或者 ...
- linux压缩解压缩
一.tar • -c:创建新文档• -x:解压缩归档文件• -f 文件名:使用归档文件• -j:使用bzip2解压缩• -z:使用gzip解压缩• -v:详细输出模式 1.压缩命令: 命令格式:tar ...
- mybatis缓存创建过程
带着 上篇 的问题,再来看看mybatis的创建过程 1.从SqlSessionFactoryBuilder解析mybatis-config.xml开始 对文件流解析 XMLConfigBuilder ...
- 关于修改Eclipse工作空间对应的文件夹名称之后的处理.
把文件夹名字从"xhkong"变成"xhkong(maintenance5.6)"之后打开这个工作空间. 导入git仓库我发现了一个之前没有发现的小技巧. 导入 ...
- poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...