socket 通信
来源:互联网 发布:行为经济学 人工智能 编辑:程序博客网 时间:2024/05/12 17:03
现在使用TCP/IP协议的应用程序通常都是采用UNIX BSD的套接字(socket)来实现网络进程之间的通信的,socket通过它的几个函数来实现网络中进程间的通信。
这几个函数分别是:
socket()函数
bind()函数
listen()、connect()函数
accept()函数
read()、write()函数
close()函数
废话不多说,下面给两端简单的代码就清楚啦
---服务器端---
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>//struct sockaddr_in
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <ctype.h>
#define PORT 8888
#define A(x) (struct sockaddr*)(&x)
void* func(void* p)
{
int c = (int)p;//套接字
char buf[1000];
for(;;){
int n;
n=read(c,buf,sizeof(buf)-1);//读取客户端来的信息
if(n<=0) break;//出错或者对方关闭就退出
buf[n] = '\0';
if(strcmp(buf,"bye\n")==0||strcmp(buf,"bye\r\n")==0) break;
int i;
write(1, buf, n);//在屏幕上显示
//转换成大写
for(i=0; i<n; i++) buf[i]=toupper(buf[i]);
write(c,buf,n);//发送到客户端
}
close(c);
}
int main()
{
int s;
s = socket(AF_INET, SOCK_STREAM, 0);//建立套接字
struct sockaddr_in si;
si.sin_family = AF_INET;
si.sin_addr.s_addr = INADDR_ANY;//0,本机的任何ip
si.sin_port = htons(PORT);
if(bind(s, A(si), sizeof(si))<0){
printf("%s\n",strerror(errno));exit(1);
}
listen(s, 5);
for(;;){
socklen_t len = sizeof(si);
int c = accept(s,A(si),&len);//等待客户端连接
if(c<0) continue;
//成功就返回新套接字
char buf[100], ip[100];
inet_ntop(si.sin_family,&si.sin_addr,ip,sizeof(ip));
printf("%sConnection successful\n", ip);
sprintf(buf,"The request from <%s,%d>\n",
ip,ntohs(si.sin_port));
write(c,buf,strlen(buf));
pthread_t id;
pthread_create(&id,NULL,func,(void*)c);
pthread_detach(id);
//close(c);
}
}
---客服端---
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main(int argc, char* argv[])
{
if(argc!=2){
printf("%s serverip\n",argv[0]);
return 0;
}
int s=socket(AF_INET,SOCK_STREAM,0);//建立套接字
struct sockaddr_in si;
si.sin_family = AF_INET;
inet_pton(AF_INET,argv[1],&si.sin_addr);
si.sin_port = htons(8888);
if(connect(s,(struct sockaddr*)&si,sizeof(si))<0){
//连接失败
perror("connect");
return 1;
}
//连接成功:
char buf[1000];
for(;;){
int n = read(s,buf,sizeof(buf));//从服务器读取
if(n<=0) if(errno!=EINTR)break;else continue;
write(1,buf,n);//显示到屏幕止
write(1,"input:",6);//提示输入
n=read(0,buf,sizeof(buf));//从键盘读取
write(s,buf,n);//发送到服务器
}
close(s);
}
- Socket通信
- Socket通信
- socket通信
- Socket通信
- Socket通信
- socket通信
- socket通信
- socket通信
- socket 通信
- socket通信
- SOCKET通信
- Socket通信
- 通信 socket
- socket 通信
- socket通信
- socket通信
- socket通信
- socket通信
- DOS mssqlserver服务 本地网络操作
- shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select
- Tomcat 停止时 JAVA进程未停止 的解决方法
- [leetcode]Word Ladder
- C++中if、#if与#ifdef、#ifndef彼此的区别
- socket 通信
- FTP 超时检测 ,C# 函数运行时超时功能改进
- Cocos2d-x数学函数和常用宏
- UIWebView 加载网页
- android渠道包自动化验证
- App.CSharp.Grid的ICells接口
- LeetCode_Reverse Linked List II
- cancel toast
- 学期总结+暑期大纲【2013.3-2013.6】