关键在路由器上!如果想让你的程序从既能从内部局域网访问,也能外部网络访问,那你必须:
1)在路由器增加一个路由项,这个路由项由将{外网IP:端口}映射到{你计算机内网IP:端口}
2)你的计算机上仍然使用{内网IP:端口}
❷ TCP/IP和Socket 是什么关系啊
TCP协议是可靠的传输协议,TCP在通讯前需要先进过三次握手建立连接,而Socket就代表这个连接,由端口号+iP地址组成
❸ socket是什么呀
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。
套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。
通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。
Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
类型
1、数据报套接字
无连接套接字,使用用户数据报协议(UDP)。在数据报套接字上发送或接收的每个数据包都单独寻址和路由。数据报套接字不能保证顺序和可靠性,因此从一台机器或进程发送到另一台机器或进程的多个数据包可能以任何顺序到达或可能根本不到达。在数据报套接字上发送广播可能需要特殊配置。
为了接收广播数据包,数据报套接字不应该绑定到特定地址,尽管在某些实现中,当数据报套接字绑定到特定地址时也可能接收广播数据包。
2、流套接字
面向连接的套接字,使用传输控制协议(TCP)、流控制传输协议(SCTP) 或数据报拥塞控制协议(DCCP)。流套接字提供了无记录边界的有序且独特的无错误数据流,并具有用于创建和销毁连接以及报告错误的明确定义的机制。
流套接字以带外功能可靠地、有序地传输数据。在 Internet 上,流套接字通常使用 TCP 实现,以便应用程序可以使用 TCP/IP 协议在任何网络上运行。
3、原始套接字
允许直接发送和接收 IP 数据包,无需任何特定于协议的传输层格式。对于其他类型的套接字,根据选择的传输层协议(例如 TCP、UDP)自动封装有效载荷,并且套接字用户不知道与有效载荷一起广播的协议头的存在。从原始套接字读取时,通常包含标头。
从原始套接字传输数据包时,自动添加标头是可选的。
大多数套接字应用程序编程接口(API),例如基于Berkeley 套接字的那些,支持原始套接字。Windows XP于 2001 年发布,在Winsock接口中实现了原始套接字支持,但三年后,微软出于安全考虑限制了 Winsock 的原始套接字支持。
原始套接字用于与安全相关的应用程序,如Nmap。原始套接字的一个用例是在用户空间中实现新的传输层协议。
原始套接字通常在网络设备中可用,用于路由协议,例如Internet 组管理协议(IGMP) 和开放最短路径优先(OSPF),以及用于Internet 控制消息协议(ICMP) 等事情,由ping 实用程序。
以上内容参考网络-套接字
❹ 网络间的通信需要ip以及端口,那么socket又是干嘛的呢
socket是插座,就是用有线连接的方式保证网络间的通信。比如计算机的网络插座socket,就是用网线将计算机与计算机之间连接起来。
❺ 在同一个计算机上怎么实现socket方法
首先,需要弄懂socket的工作机制,无需装什么虚拟机。
大致的思路是这样:
一、服务器端,将socket绑定在本地IP的某个端口,如6000;启动监听并开始接受客户端。
二、客户端,创建socket以后,连接到本地IP的6000端口,这样就可以了。
三、然后,双方收发数据。
注意:给本地服务器发送数据,网络协议并不将数据发送到网卡上,所以这种类型的数据流是不会出现在网络上的。其他方面的特性和远端通信是差不多的。
❻ 计算机网络课设 socket 编程
目的及要求:熟悉ICMP协议的作用,利用ICMP的回送请求和回送应答来进行检测出到达网络上任何一台目的主机途中所经过的路由器,并将结果显示在标准输出上。通过本实验,使学生更加熟悉ICMP报文的结构,对ICMP协议有更好的理解和认识。l 具体内容(1)定义好IP分组、ICMP报文相关的数据结构;(2)在WINDOWS环境下实现程序;(3)在命令提示符下输入:“mytrace IP地址 或 主机名 或 域名”;数)持续发送ICMP回送请求数据包,其中的IP首部TTL字段依次增加,如果是中途路由器收到TTL为0的IP分组后,将会发回超时的错误报告ICMP响应报文,如果到达最后的主机,将会发回ICMP回送应答
❼ 如何用SOCKET实现两台计算机之间的通讯
两部分代码,一个server,一个client。
server 端代码:
#include"stdio.h"
#include"Winsock2.h"
#include"iostream"
#include"string"
//#pragmacomment(lib,"ws2_32.lib")
//definehostIPansableport.
#defineHOST_IP127.0.0.1
#defineHOST_PORT8080
#defineOK_STR"OK"
voidmain(){
//theversionbitofWinsock
intversion_a=1;//lowbit
intversion_b=1;//highbit
//makeword
WORDversionRequest=MAKEWORD(version_a,version_b);
WSADatawsaData;
interr;
err=WSAStartup(versionRequest,&wsaData);
if(err!=0){
printf("ERROR!");
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
printf("WRONGWINSOCKVERSION!");
WSACleanup();
return;
}
SOCKETsocServer=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INaddr_Srv;
//It'snestthreestructsasS_un_b,S_un_wandS-un.(union)
addr_Srv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
//setprotocolfamily
addr_Srv.sin_family=AF_INET;
//sethostport
addr_Srv.sin_port=htons(HOST_PORT);
//bindsockettothehost
bind(socServer,(SOCKADDR*)&addr_Srv,sizeof(SOCKADDR));
//addressofaclient
SOCKADDR_INaddr_Clt;
charrecvBuf[100];
intfromlen=sizeof(SOCKADDR);
while(true){
recvfrom(socServer,recvBuf,100,0,(SOCKADDR*)&addr_Clt,&fromlen);std::cout<<recvBuf<<std::endl;
sendto(socServer,OK_STR,strlen(OK_STR)+1,0,(SOCKADDR*)&addr_Clt,sizeof(SOCKADDR));
}
closesocket(socServer);
WSACleanup();
}
client端代码:
#include"Winsock2.h"
#include"iostream"
#include"stdio.h"
#pragmacomment(lib,"ws2_32.lib")
#defineHOST_IP"127.0.0.1"
#defineHOST_PORT8080
voidmain(){
//theversionbitofWinsock
intversion_a=1;//lowbit
intversion_b=1;//highbit
//makeword
WORDversionRequest=MAKEWORD(version_a,version_b);
WSADatawsaData;
interror;
error=WSAStartup(versionRequest,&wsaData);
if(error!=0){
printf("ERROR!");
return;
}
if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)
{
printf("WRONGWINSOCKVERSION!");
WSACleanup();
return;
}
//requestinfoobtainedbyuser'sinput
charrequestStr[100];
//buildasockeet
SOCKETsocClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;//settheprotocolfamily
addrSrv.sin_port=htons(HOST_PORT);//settheportnumber
//.
charcRecvBuf[100];
while(true){
std::cin>>requestStr;
//
sendto(socClient,requestStr,strlen(requestStr)+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
recv(socClient,cRecvBuf,strlen(cRecvBuf)+1,0);
std::cout<<cRecvBuf<<std::endl;
}
//
closesocket(socClient);
WSACleanup();
//return0;
}
❽ 计算机网络socket linux下用c或c++写
/*服务器*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/
int do_listen(const int port, const int bTcp)
{
int s = 0, r = 0, o = 1;
struct sockaddr_in h;
memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = INADDR_ANY;
s = socket(AF_INET, bTcp?SOCK_STREAM:SOCK_DGRAM, 0);
if (s < 1) { perror("socket(listen)"); return 0;}
r = setsockopt(s, SOL_SOCKET,SO_REUSEADDR, (char *)&o, sizeof(int));
if (r == -1) { perror("setsockopt(listen)"); return 0;}
r = bind(s, (struct sockaddr *)&h, sizeof(h));
if (r == -1) { perror("bind(listen)"); return 0;}
if (bTcp) {
r = listen(s, SOMAXCONN);
if (r == -1) { perror("listen()"); return 0;}
}/*end if*/
/*signal(SIGPIPE, SIG_IGN);*/
return s;
}/*end do_listen*/
void response(int sck, struct sockaddr_in * host)
{
FILE * f = 0; char cmd[szSTR]; time_t now;
struct tm * t = 0;
f = fdopen(sck, "w+");
while(!feof(f)) {
memset(cmd, 0, szSTR);
fgets(cmd, szSTR -1, f);
time(&now);
t = localtime(&now);
if(strstr(cmd, "DATE")) {
fprintf(stderr, "Query Type: Date\n");
fprintf(f, "Date: %d %d, %d\n", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900);
continue;
}/*end if*/
if(strstr(cmd, "TIME")) {
fprintf(stderr, "Query Type: Time\n");
fprintf(f, "Time: %02d::%02d::%02d\n", t->tm_hour, t->tm_min, t->tm_sec);
continue;
}/*end if*/
if(strstr(cmd, "EXIT")) break;
fprintf(f, "commands: DATE, TIME, EXIT.\n");
}/*end while*/
shutdown(sck, SHUT_RDWR);
close(sck);
fclose(f);
return ;
}/*end response*/
int main(void)
{
socklen_t sklen = 0;int sck = 0, i = 0, listener = 0;
struct sockaddr_in client; pid_t proc = 0;
system("ifconfig");
listener = do_listen(SERVERPORT, 1);
if(listener < 1) { perror("listen()"); return 0; }
for(i=0;i<2;i++) {
memset(&client, 0, sizeof(client));
sklen = sizeof(client);
sck = accept(listener, (struct sockaddr *)&client, &sklen);
if(sck < 1) break;
proc = fork();
if (proc == -1) { perror("fork()"); break ; }
if(proc) continue;
response(sck, &client);
break;
}/*next*/
close(listener);
return 0;
}/*end main*/
/*客户机*/
#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/io.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
#define szSTR 256
#define SERVERPORT 21429 /*please modify the port with your id*/
int cnn(const char * ip, const int port)
{
struct sockaddr_in h; memset(&h, 0, sizeof(h));
h.sin_family = AF_INET; h.sin_port = htons(port);
h.sin_addr.s_addr = inet_addr(ip);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 1) { perror("socket(tcp)"); return 0;}
int r = connect(s, (struct sockaddr *)&h, sizeof(h));
if (r == 0) return s;
perror("connect()");
return 0;
}//end cnn
int main(void)
{
int sck = 0; FILE * f = 0; char ip[szSTR]="127.0.0.1";
fprintf(stderr, "Please input the calendar server ip:");
fgets(ip, szSTR - 1, stdin);
sck = cnn(ip, SERVERPORT);
if(sck < 1) return 0;
f = fdopen(sck, "w+");
fprintf(f, "DATE\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "TIME\r\n");
fgets(ip, szSTR -1 , f);
fprintf(stderr, "%s\n", ip);
fprintf(f, "EXIT\r\n");
fclose(f);
close(sck);
return 0;
}/*end main*/
❾ 什么是Socket简单点,通俗易懂的
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。