TCP/IP网络编程系列之一(初级)
- 首先你如果要和别人沟通肯定要安装好电话机才可以,所以对应套接字的是调用socket函数时进行对话。
#include<sys/socket.h>
int socket(int domain,int type,int protocol)
成功时返回文件描述符,失败时返回-1.
2. 其次调用bind函数分配电话号码进行对话,所以用到bind函数,实际上分配的是ip地址。
#include <sys/socket.h>
int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen)
成功时返回0,失败返回-1
int listen(int sockfd,int backlog)
成功时返回0,失败时返回-.
int accept(int skckfd,struct sockaddr *addr,socklen_t *addrlen)
成功时返回文件描述符,失败时返回-.
- 调用socket函数创建套接字,为通话准备条件。
- 调用bind函数分配ip地址和端口,从而确定地址。
- 调用listen函数转为可接受请求状态。
- 调用accept函数受理连接请求。
代码实现(基于LINUX)
编写服务端代码,服务端是能够受理连接请求的程序,该服务端收到连接请求之后向请求者返回"Hello!"。先不用关注语言细节,先把整个套接字编程的整个过程熟悉一遍。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> void Error_Handling(char *message); int main(int argc,char *argv[])
{
int serverSocket;
int clientSocket;
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
socklen_t clientSocketAddrSize;
char message []="Hello!";
if(argc != )
{
printf("Usage:%s <port>\n",argv[]);
exit();
}
serverSocket = socket(PF_INET,SOCK_STREAM,);
if(serverSocket == -)
{
Error_Handling("socket() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
serverAddr.sin_port=htons(atoi(argv[]));
if(bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("bind() error"); }
if(listen(serverSocket,)==-)
{
Error_Handling("listen() error");
}
clientSocketAddrSize = sizeof(clientAddr);
clientSocket = accept(serverSocket,(struct sockaddr*)&clientAddr,&clientSocketAddrSize);
if(clientSocket == -)
{
Error_Handling("accept() error"); }
write(clientSocket,message,sizeof(message));
close(clientSocket);
close(serverSocket);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
套接字服务端程序
注解:
- 第23行:调用socket函数创建套接字。
- 第32行:调用bind函数分配IP地址和端口号
- 第37行:调用listen函数套接字转为可接受链接状态。d
- 第42行:调用accept函数受理请求连接。如果在没有连接请求的情况系调用该函数,则不会返回,知道有链接请求为止。
- 第48行:write函数用于传输数据。
构建打电话套接字(编写客户端代码)
服务器端创建的套接字又称为服务器套接字或监听程序套接字。客户端套接字的创建过程比服务器端套接字简单。
请求连接的函数,因为其调用的是客户端套接字。
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
成功时返回0,失败时返回-.
客户端套接字程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h> #define MAXSIZE 30
void Error_Handling(char* message); int main(int argc,char* argv[])
{
int sock;
struct sockaddr_in serverAddr;
char message[MAXSIZE];
int str_len;
if(argc != )
{
printf("Usage : %s <IP> <Port> \n",argv[]);
exit();
}
sock = socket(PF_INET,SOCK_STREAM,);
if(sock == -)
{
Error_Handling("sock() error");
}
memset(&serverAddr,,sizeof(serverAddr));
serverAddr.sin_family=AF_INET;
serverAddr.sin_addr.s_addr=inet_addr(argv[]);
serverAddr.sin_port=htons(atoi(argv[]));
if(connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr))==-)
{
Error_Handling("connect() error");
} str_len = read(sock,message,sizeof(message)-);
if(str_len == -)
{
Error_Handling("read error");
}
printf("Message from server : %s \n",message);
close(sock);
return ;
} void Error_Handling(char *message)
{
fputs(message,stderr);
fputc('\n',stderr);
exit();
}
客户端套接字程序
linux 平台运行(我的环境时Debian 7)

此时服务端在等待请求,然后先打开一个窗口并运行客户端代码,然后如下图所示

1.在有些函数里面成功时返回文件描述符,其中文件描述符也叫文件句柄
| 文件描述符 | 对象 |
| 0 | 标准输入:Standard Input |
| 1 | 标准输出:Standard Output |
| 2 | 标准错误:Standard Error |
要想了解具体代码含义,轻耐心等待下一篇博客(套接字类型和协议设置)!
参考书籍:
《Unix 网络编程》
《TCP/IP 网络编程》
TCP/IP网络编程系列之一(初级)的更多相关文章
- TCP/IP网络编程系列之四(初级)
TCP/IP网络编程系列之四-基于TCP的服务端/客户端 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP和UDP套接字.因为TCP套接字是面向连接的,因此又称为基于流的 ...
- TCP/IP网络编程系列之三(初级)
TCP/IP网络编程系列之三-地址族与数据序列 分配给套接字的IP地址和端口 IP是Internet Protocol (网络协议)的简写,是为首发网络数据而分配给计算机的值.端口号并非赋予计算机值, ...
- TCP/IP网络编程系列之二(初级)
套接字类型与协议设置 我们先了解一下创建套接字的那个函数 int socket(int domain,int type,int protocol);成功时返回文件描述符,失败时返回-1.其中,doma ...
- TCP/IP网络编程之多进程服务端(二)
信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...
- 浅谈TCP/IP网络编程中socket的行为
我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...
- 《TCP/IP网络编程》
<TCP/IP网络编程> 基本信息 作者: (韩)尹圣雨 译者: 金国哲 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115358851 上架时间:2014-6- ...
- TCP/IP网络编程之多线程服务端的实现(二)
线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...
- TCP/IP网络编程之优于select的epoll(二)
基于epoll的回声服务端 在TCP/IP网络编程之优于select的epoll(一)这一章中,我们介绍了epoll的相关函数,接下来给出基于epoll的回声服务端示例. echo_epollserv ...
- TCP/IP网络编程之进程间通信
进程间通信基本概念 进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间.但我们知道,进程具有完全独立的内存结构,就连通过fork函数创建的子进程 ...
随机推荐
- VS 特殊注释
任务注释(添加此注释后,点击视图->任务列表,可以看到TODO注释的位置)://TODO: (未实现)……//UNDONE:(没有做完)……//HACK:(修改)……
- 【VS开发】字符,字节和编码
字符,字节和编码 [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/encoding.htm] 级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理 ...
- 封装自己的jquery插件
自己尝试封装的一个在工作当中使用的多级弹窗插件: ;(function ($, window, document) { //用一个自调用匿名函数把插架代码包裹起来,防止代码污染 $.fn.multi ...
- Redis高级主题
Redis高级主题 持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同 ...
- PTA(Basic Level)1077.互评成绩计算
在浙大的计算机专业课中,经常有互评分组报告这个环节.一个组上台介绍自己的工作,其他组在台下为其表现评分.最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平 ...
- <<C++ Primer>> 第 6 章 函数
术语表 第 6 章 函数 二义性调用(ambiguous call): 是一种编译时发生的错误,造成二义性调用的原因时在函数匹配时两个或多个函数提供的匹配一样好,编译器找不到唯一的最佳匹配. 实 ...
- KMP(next数组的更新理解)Codeforces Round #578 (Div. 2)--Compress Words
题目链接:https://codeforc.es/contest/1200/problem/E 题意: 有n串字符串,让你连起来:sample please ease in out ---> ...
- Java重要类之LinkedList
一.ArrayList与LinkedList 基本概念:List是一个接口,Arraylist和LinkedList是它的两个实现类,只是实现的方式不一样.我在“单链表java实现”一文中已经对单链表 ...
- 转载Spring Data JPA 指南——整理自官方参考文档
转载:https://blog.csdn.net/u014633852/article/details/52607346 官方文档 https://docs.spring.io/spring-data ...
- 使用JavaScript实现字符串格式化
使用JavaScript实现字符串格式化 String.prototype.format = function (kwargs) { /* hello-{n}-{m} {'n':'word','m': ...