程序是网上找的,注释很多都是看懂书后加上的 只是很简单的程序
其中的一个结构体可以查找资料

其中server端 :
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main()
{
int sfp, nfp; /*定义两个描述符*/
struct sockaddr_in s_add, c_add;
int sin_size;
unsigned short portnum = 0x8888;//服务使用端口

printf("Hello,welcome to my server !\r\n");
sfp = socket(AF_INET, SOCK_STREAM, 0);//创建套接字连接
if(-1 == sfp){
printf("socket fail! \n");
return -1;
}
printf("socket is ok! \n");
//填充服务器端口地址信息,以便下面使用此地址和端口监听
bzero(&s_add,sizeof(struct sockaddr_in));/* extern void bzero(void *s, int n);
置字节字符串s的前n个字节为零且包括‘\0’。*/
s_add.sin_family=AF_INET;//AF_INET IPv4互联网协议
s_add.sin_addr.s_addr = htonl(INADDR_ANY);//自动填出IP地址
s_add.sin_port = htons(portnum);//端口号
/*使用bind进行绑定端口 函数:int bind(int sockfd, const struct sockaddr *addr,socklen_len len)
* 指明函数套接字将使用本地的哪一个协议端口进行数据传送(IP地址和端口号),协议地址addr是通用地址,len是
* 该地址结构(第二个参数)的长度。一般而言,服务器调用此函数,而客户端则很少调用它
*/
if(-1 == bind(sfp,(struct sockaddr *)(&s_add),sizeof(struct sockaddr))){
printf("bind fail !\r\n");
return -1;
}
printf("bind ok ! \n");

/*int listen(int sockfd, int backlog)
*作用:将为连接的套接字转换成被动套接字,提示内核应该接受指向此套接字的连接请求;第二个参数规定了内核为此套接
*字排队的最大连接个数
*/
if(-1 == listen(sfp, 5)){
printf("listen is fail !\n ");
return -1;
}
printf("listen ok \n" );
while (1){
sin_size = sizeof(struct sockaddr_in);
/* accept服务端使用函数,调用时即进入阻塞状态,等待用户进行连接,在没有客户端进行连接时,程序停止在此处,
不会看到后面的打印,当有客户端进行连接时,程序马上执行一次,然后再次循环到此处继续等待。
此处accept的第二个参数用于获取客户端的端口和地址信息。
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
*/
nfp = accept(sfp, (struct sockaddr *)(&c_add),&sin_size);
if(-1 == nfp){
printf("accept fail ! \n ");
return -1;
}
printf("accept ok! \r\n Server start get connect from %#x : %#x\r\n",ntohl(c_add.sin_addr.s_addr),ntohs(c_add.sin_port) );
//ntohl()是将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
//这里使用write向客户端发送信息
if(-1 == write(nfp,"hello,welcome to my server \r\n",32)){
printf("write fail ! \r\n");
return -1;
}
printf("write ok \r\n");
close(nfp);
}
return 0;
}

client端:
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>

int main(void)
{
int cfp; //文件描述符
int recbytes;
int sin_size;
char buffer[1024] = {0};
struct sockaddr_in s_add, c_add;
unsigned short portnum = 0x8888;

printf("Hello,welcome to client !\r\n ");
//建立socket 使用因特网,tcp流传输
cfp = socket(AF_INET, SOCK_STREAM, 0);
if(-1 == cfp){
printf("socket fail !\r\n");
return -1;
}
printf("socket ok !\r\n");
//构建服务器端的ip和端口信息,具体结构可以查资料
bzero(&s_add,sizeof(struct sockaddr_in));
s_add.sin_family = AF_INET;
s_add.sin_addr.s_addr =inet_addr("192.168.1.106");//ip地址根据自己情况而定
s_add.sin_port = htons(portnum);/* 这里htons是将short型数据字节序由主机型转换为网络型,其实就是
将2字节数据的前后两个字节倒换,和对应的ntohs效果、实质相同,只不过名字不同。htonl和ntohl是
操作的4字节整形。将0x12345678变为0x78563412,名字不同,内容两两相同,一般情况下网络为大端,
PPC的cpu为大端,x86的cpu为小端,arm的可以配置大小端,需要保证接收时字节序正确。
*/
printf("s_add = %#x,port :%#x\r\n",s_add.sin_addr.s_addr, s_add.sin_port);
/* int connet(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
*
*/
if(-1 == connect(cfp,(struct sockaddr *)(&s_add), sizeof(struct sockaddr))){
printf("connect fail !\r\n");
return -1;
}
printf("connect ok !\r\n");
//链接成功, 从服务器端接收字符
if(-1 == (recbytes = read(cfp,buffer,1024))){
printf("read data fail !\r\n");
return -1;
}
printf("read ok \r\nREC: \r\n");
buffer[recbytes] = '\0';
printf("%s\r\n", buffer);

getchar();//此句为使程序暂停在此处,可以使用netstat查看当前的链接
close(cfp);
return 0;
}
运行结果:
server:

client:

更多相关文章

  1. linux配置虚拟IP地址方法
  2. 使用.NetCore在Linux上写TCP listen 重启后无法绑定地址
  3. 嵌入式linux 字节对齐 导致输出Alignment trap
  4. Linux系统下用C语言获取MAC地址
  5. Red Hat Linux下如何修改网卡MAC地址
  6. 一些下载交叉编译环境的地址
  7. 如何使用SQL语句查到当前SQL SERVER 2000服务器的IP地址
  8. 【JavaWeb-6】HttpServletResponse的字符字节输出流、编码、文件
  9. 如何通过HttpURLConnection得到http 302的跳转地址

随机推荐

  1. Android快速生成MVP 模式代码
  2. Android(安卓)Drawable Resource学习(二)、
  3. Android : android 9.0 audio 接口分析
  4. Android Studio 之 AndroidManifest.xml
  5. android studio打包apk时遇见的一些问题
  6. Android(安卓)签名详解
  7. android:sharedUserId="android.uid.syst
  8. Android的Touch系统简介(一)
  9. android背景选择器selector用法
  10. 安装android sdk 遇到几个问题