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 < < ...
随机推荐
- delphi 动态建立WebBrower
//Delphi动态建立WebBrowerunit Main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphi ...
- [GIF] The Phase Property in GIF Loop Coder
In this lesson, we look at one of the most powerful features in GIF Loop Coder, the phase property, ...
- iOS开发——新特性篇&swift新特性(__nullable和__nonnull)
swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的时候产生 ...
- pager 命令
https://www.percona.com/blog/2013/01/21/fun-with-the-mysql-pager-command/ Last time I wrote about a ...
- mysql高效获取两张表共同字段的交集数据
例如下面两站表A,B.A表和B表分别有5-10w数据.A表结构如下:id bid name title publisher extraB表结构如下id bid name title publisher ...
- 组合数学poj 1496 1850 同样的代码过两题
Description 1942 Transmitting and memorizing information is a task that requires different coding ...
- oracle存储过程分页
1.首先在oracle中建包体,用于游标返回当前数据记录集 CREATE OR REPLACE PACKAGE pkg_query AS TYPE cur_query IS REF CURSOR; E ...
- Debian 7 安装 Emacs 24.3
Emacs 24.3出来好久了,但是在Debian 7里还是Emacs 23的版本. 以下是安装步骤(9步): -dev libncurses5-dev autoconf automake texin ...
- 如何向Android模拟器打电话发短信
1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5 ...
- 进程间通信之管道(pipe、fifo)
我们先来说说进程间通信(IPC)的一般目的,大概有数据传输.共享数据.通知事件.资源共享和进程控制等.但是我们知道,对于每一个进程来说这个进程看到属于它的一块内存资源,这块资源是它所独占的,所以进程之 ...