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 < < ...
随机推荐
- pthread实现多线程查询(转)
导读:大多数网站的性能瓶颈不在PHP服务器上,因为它可以简单地通过横向增加服务器或CPU核数来轻松应对(对于各种云主机,增加VPS或CPU核数就更方便了,直接以备份镜像增加VPS,连操作系统.环境都不 ...
- Activate、Deactivate 事件 Activate ThrottleEvent;
http://help.adobe.com/zh_CN/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html Activate.De ...
- How to Check if an Array Contains a Value in Java Efficiently?---reference
How to check if an array (unsorted) contains a certain value? This is a very useful and frequently u ...
- rabbitmq——用户管理
安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...
- C# WinForm 中ComboBox数据绑定的问题 (转)
来自:http://blog.sina.com.cn/s/blog_5fb9e26301013wga.html C# WinForm 中ComboBox数据绑定的问题 怎样让WinForm中的Comb ...
- InvocationTargetException
在使用反射的适合,调用的方法无论抛出什么异常,都会变成InvocationTargetException,要想得到原始的异常,必须使用getTargetException()
- ibatis中isEquals、isNotEmpty的用法
一:isEquals用于动态拼接sql 如下实例: 如果status的状态为0,则更新attribute1;状态为1,则更新attribute2; 状态为2,则更新attribute3. <up ...
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
在做AndroidScreenSlidePager开源库练习demo的时候,发现布局文件使用的是<merge>标签而不是<FrameLayout>标签.作者给出的说法是:Cir ...
- Delphi各个版本和发展历史(转)
Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD).它的前身,即是DOS时代盛行一时的“BorlandTurbo ...
- 在Delphi中,关于数组名称
动态数组数组名代表的是第一个元素的内存地址. 静态数组名称代表的是数组第一个元素的内存位置, 而不是数组第一个元素的内存地址. 但对于静态数组,在某些情况下编译器可能会自动取数组地址,如: funct ...