導航:首頁 > 編程系統 > linuxcsendto

linuxcsendto

發布時間:2021-03-26 03:44:52

linux C語言編程,socket實現的即使通訊系統

//服務端server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 6000 /*伺服器監聽埠號 */
#define BACKLOG 10 /* 最大同時連接請求數 */
#define MAXDATASIZE 100

main()
{
char buf[MAXDATASIZE];
int sockfd,client_fd; /*sock_fd:監聽socket;client_fd:數據傳輸socket */
struct sockaddr_in my_addr; /* 本機地址信息 */
struct sockaddr_in remote_addr; /* 客戶端地址信息 */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind出錯!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出錯!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出錯");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子進程代碼段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
close(client_fd);
exit(0);
}
buf[recvbytes] = '\0';
printf("from client Received: %s",buf);

if (send(client_fd, "thanks!\n", 8, 0) == -1)
perror("send出錯!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}

//客戶端client.c
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 6000
#define MAXDATASIZE 100

main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出錯!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket創建出錯!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect出錯!");
exit(1);
}

if (send(sockfd, "hello!\n", 7, 0) == -1)
{
perror("send出錯!");
exit(1);
}

if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出錯!");
exit(1);
}
buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
}

㈡ socket linux c++ send()函數

給你一個代碼,linux下編譯運行即可,做了簡單的注釋,client.c如下:

send()函數在client.c末尾

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#defineMAXLINE4096//發送接受信息長度
#definePORT6666//埠

intmain(intargc,char**argv)
{
intsockfd,n;
charrecvline[MAXLINE],sendline[MAXLINE];
structsockaddr_inservaddr;

if(argc!=2){
printf("usage:./client<ipaddress> ");//使用方法
exit(0);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//創建套接字,並未連接
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}


//memset(結構體地址,清零,要清零的長度);清零結構體servaddr,將結構體數據全部設置為0
//同bzero(結構體地址,要清理的長度);默認清零
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_port=htons(PORT);//埠號

//servaddr.sin_addr.s_addr=inet_addr(argv[1]);//伺服器IP,如下功能相同
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0){
printf("inet_ptonerrorfor%s ",argv[1]);
exit(0);
}

//連接伺服器
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){
printf("connecterror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("sendmsgtoserver: ");
fgets(sendline,MAXLINE,stdin);//輸入向伺服器發送的信息

if(send(sockfd,sendline,strlen(sendline),0)<0)//向伺服器發送信息
{
printf("sendmsgerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

close(sockfd);//關閉套接字
exit(0);
}

伺服器程序:server.c如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#defineMAXLINE4096
#definePORT6666

intmain(intargc,char**argv)
{
intlistenfd,connfd;
structsockaddr_inservaddr;
charbuff[MAXLINE];
intn;

if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){//創建套接字
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

memset(&servaddr,0,sizeof(servaddr));//結構體清零
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//指定接受任何連接
servaddr.sin_port=htons(PORT);//監聽埠

//給套介面綁定地址
if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1){
printf("bindsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

if(listen(listenfd,10)==-1){//開始監聽,最大請求數為10,可以自己設置
printf("listensocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("======waitingforclient'srequest====== ");

while(1){
//建立通信,等待客戶端connect()函數的連接
if((connfd=accept(listenfd,(structsockaddr*)NULL,NULL))==-1)
{
printf("acceptsocketerror:%s(errno:%d)",strerror(errno),errno);
continue;
}
n=recv(connfd,buff,MAXLINE,0);//n可以判斷錯誤,此處可直接用recv()函數
//接收到的信息存放在buff中
buff[n]='';//添加結束符
printf("recvmsgfromclient:%s ",buff);
close(connfd);
}

close(listenfd);
}

㈢ 我在linux環境下編寫udp客戶端程序。為什麼使用sendto發送數據時,接收端接收不到數據。

1、檢查客戶端和服務端的埠號是否一致;
2、接收端的socket要採用block模式,數據收到後列印出來.

㈣ linux 下C語言的syn掃描代碼

//---------------------------------------------------------------------------
//Filename:ss.c
//Author:yunshu
//Write:2004-04-02
//Thanks Wineggdrop
//Modify:2004-09-08
//---------------------------------------------------------------------------

#include <winsock2.h>
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <stdio.h>

#pragma comment(lib,"ws2_32.lib")

////////////////////////////////////////////////////////////////
//全局變數
////////////////////////////////////////////////////////////////

#define srcPort 88

char srcIP[20] = ;//定義源地址
char tgtIP[20] = ;//定義目的地址
int portNow;//定義正在掃描的埠

//標准埠列表
int ports[20] = ;

typedef struct ip_hdr
{
unsigned char h_verlen; //4位首部長度,4位IP版本
unsigned char tos; //8位服務類型TOS
unsigned short total_len; //16位總長度(位元組)
unsigned short ident; //16位標識
unsigned short frag_and_flags; //3位標志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協議 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校驗和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;

typedef struct tcp_hdr //定義TCP首部
{
USHORT th_sport; //16位源埠
USHORT th_dport; //16位目的埠
unsigned int th_seq; //32位序列號
unsigned int th_ack; //32位確認號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數據偏移量
}TCP_HEADER;

typedef struct tsd_hdr //定義TCP偽首部
{
unsigned long saddr; //源地址
unsigned long daddr; //目的地址
char mbz;
char ptcl; //協議類型
unsigned short tcpl; //TCP長度
}PSD_HEADER;

////////////////////////////////////////////////////////////////
//函數原形
////////////////////////////////////////////////////////////////

int send_packet();//發送數據函數
int recv_packet();//監聽數據函數
USHORT checksum( USHORT *, int );//計算檢驗和函數
void usage( char * );//顯示幫助函數
void check_port( char * );//判斷埠是否開放函數

////////////////////////////////////////////////////////////////
//main函數
////////////////////////////////////////////////////////////////

int main( int argc , char *argv[] )
{
WSADATA WSAData;
DWORD thread_ID = 1;
char FAR hostname[128] = ;
HANDLE ThreadHandle[20];
struct hostent *phe;

if( argc != 2 )//檢查命令行參數是否正確
{
usage( argv[0] );
exit( 0 );
}

if ( WSAStartup(MAKEWORD(2,2) , &WSAData) )
{
printf("WSAStartup Error...\n");
exit(0);
}

strcpy(tgtIP,argv[1]);//得到目標主機的ip地址

gethostname(hostname,128);//獲取本機主機名

phe = gethostbyname(hostname);//獲取本機ip地址結構

if(phe == NULL)
{
printf("Get LocalIP Error...\n");
}

strcpy(srcIP, inet_ntoa(*((struct in_addr *)phe->h_addr_list[0])));//得到本機ip地址

//調試用,注釋掉
//printf("test\t%s\n",tgtIP);
//printf("test\t%s\n",srcIP);

//開啟新線程,接受數據包,分析返回的信息
HANDLE RecvHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)recv_packet,NULL,0,&thread_ID);

Sleep(500);//休息一下再啟動發送數據包函數

for(int tmp = 0; tmp < 20; tmp++)
{
++thread_ID;

//要掃描的埠
portNow = ports[tmp];

//開啟新線程,發送數據包
ThreadHandle[tmp] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)send_packet,NULL,0,&thread_ID);

//防止生成線程過快,休息
Sleep(100);
}

DWORD WaitThread = WaitForMultipleObjects( 20 , ThreadHandle , TRUE , INFINITE );
if( WaitThread != WAIT_FAILED)
{
for( int n = 0 ; n < 20 ; n++ )
{
CloseHandle( ThreadHandle[n] );
}
}
CloseHandle( RecvHandle );

WSACleanup();
return 0;
}

//計算檢驗和函數,完全抄別人的
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;

while(size >1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);
}

void usage(char *prog)
{
printf("===========================================\n");
printf("Used To Scan Remote Host's Ports\n");
printf("Usage:%s TargetIP\n",prog);
printf("===========================================\n");
exit(0);
}

//發送數據包的函數
int send_packet()
{
SOCKET sendSocket;
BOOL flag;
int timeout;
SOCKADDR_IN sin;
IP_HEADER ipHeader;
TCP_HEADER tcpHeader;
PSD_HEADER psdHeader;
char szSendBuf[60] = ;
int ret;
unsigned long source_ip;
unsigned long target_ip;

//建立原生數據socket
if((sendSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Socket Setup Error...\n");
return 0;
}

//設置自己填充數據包
if(setsockopt(sendSocket, IPPROTO_IP, IP_HDRINCL, (char *)&flag, sizeof(flag)) == SOCKET_ERROR)
{
printf("Setsockopt IP_HDRINCL Error...\n");
return 0;
}

//設置超時時間
timeout = 1000;
if(setsockopt(sendSocket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) == SOCKET_ERROR)
{
printf("Setsockopt SO_SNDTIMEO Error...\n");
return 0;
}

target_ip = inet_addr(tgtIP);
source_ip = inet_addr(srcIP);

sin.sin_family = AF_INET;
sin.sin_port = htons(portNow);
sin.sin_addr.S_un.S_addr = target_ip;

//填充IP首部
ipHeader.h_verlen = (4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
ipHeader.total_len = htons(sizeof(ipHeader)+sizeof(tcpHeader));
ipHeader.ident = 1;
ipHeader.frag_and_flags = 0x40;
ipHeader.ttl = 128;
ipHeader.proto = IPPROTO_TCP;
ipHeader.checksum = 0;
ipHeader.sourceIP = source_ip;//源IP
ipHeader.destIP = target_ip;//目的IP

//填充TCP首部
tcpHeader.th_dport = htons(portNow);//目的埠
tcpHeader.th_sport = htons(srcPort); //源埠
tcpHeader.th_seq = 0x12345678;
tcpHeader.th_ack = 0;
tcpHeader.th_lenres = (sizeof(tcpHeader)/4<<4|0);
tcpHeader.th_flag = 2;//syn標志位。0,2,4,8,16,32->FIN,SYN,RST,PSH,ACK,URG(推測,哈哈)
tcpHeader.th_win = htons(512);
tcpHeader.th_urp = 0;
tcpHeader.th_sum = 0;

//填充tcp偽首部
psdHeader.saddr = ipHeader.sourceIP;
psdHeader.daddr = ipHeader.destIP;
psdHeader.mbz = 0;
psdHeader.ptcl = IPPROTO_TCP;
psdHeader.tcpl = htons(sizeof(tcpHeader));

//計算TCP校驗和
memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
memcpy(szSendBuf + sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));

tcpHeader.th_sum = checksum((USHORT *)szSendBuf, sizeof(psdHeader) + sizeof(tcpHeader));

//計算IP檢驗和
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
memset(szSendBuf + sizeof(ipHeader) + sizeof(tcpHeader), 0, 4);
ipHeader.checksum = checksum((USHORT *)szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader));

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
memcpy(szSendBuf + sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));

//發送數據包
ret = sendto(sendSocket, szSendBuf, sizeof(ipHeader) + sizeof(tcpHeader), 0, (struct sockaddr*)&sin, sizeof(sin));

if(ret == SOCKET_ERROR)
{
printf("Send Packet Error...\n");
return 0;
}
else return 1;
}

int recv_packet()
{
SOCKADDR_IN sniff;
SOCKET sock;
char recvBuffer[65000] = ;//緩沖區存放捕獲的數據

//建立socket監聽數據包
sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);

sniff.sin_family = AF_INET;
sniff.sin_port = htons(0);
sniff.sin_addr.s_addr = inet_addr(srcIP);

//綁定到本地隨機埠
bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));

//設置SOCK_RAW為SIO_RCVALL,以便接收所有的IP包
//來的
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL);

while(TRUE)
{
memset(recvBuffer , 0 , sizeof(recvBuffer) );

//開始捕獲數據包
int bytesRecived = recv(sock,recvBuffer,sizeof(recvBuffer),0);
if(bytesRecived <= 0)
{
break;
}
check_port(recvBuffer);
}
return 1;
}

void check_port(char *buffer)
{
IP_HEADER *ipHeader;//IP_HEADER型指針
TCP_HEADER *tcpHeader;//TCP_HEADER型指針

ipHeader = (IP_HEADER *)buffer;
tcpHeader = (TCP_HEADER *) (buffer+sizeof(IP_HEADER));

if(ipHeader->sourceIP != inet_addr(tgtIP))
{
return;
}

for(int tmp=0;tmp<20;tmp++)
{
//SYN+ACK -> 2+16=18(也是推測,哈哈)
if(tcpHeader->th_flag == 18 && tcpHeader->th_sport == htons(ports[tmp]))
{
printf("[Found]\t%s\tport\t%d\tOpen\n",tgtIP,ports[tmp]);
}
}
}

㈤ 如何在linux下用c語言編寫一個能夠發送icmp報文的小程序

需要建立來socket,參數是AF_INET,SOCK_RAW,IPPROTO_ICMP

自己構自造ICMP數據包,sendto發送給某地址。

ICMP有多種,你可以發送type為13的時間戳請求。

然後調用recvfrom會收到type為14的timestampreply的IP包,

IP頭一般是20Bytes,裡麵包含srcIP,desIP還有TTL等。

IP包的數據就是返回ICMPtimestampreply報文,裡面有origTimestamp,recvTimestamp,transStamp,可以計算出時間。

可以參考網頁鏈接網頁鏈接

覺得有幫助可以注冊帳號,給他點個「星」

㈥ linux c下面 select函數的問題

是不是select實參傳錯了,都傳入的是讀的集合了。

㈦ Linux C 網路編程....使用socket通訊...

你可能使用的是TCP連接,這是基於連接發送,是流式傳輸,沒有邊界。
不過一般都有一個緩沖回區,滿答了後才發送出去,要想沒滿就發送的話,就得使用推。

一個很重要的原因可能是你send的時候傳入的第3個實參有問題。

另外有一點可能是低潮限製造成的。
可以用SO_SNDLOWAT套接字選項設置一個大一點的低潮。

另外你這樣發送,可能會有主機大小端影響。最好是作為文本串來傳輸。

㈧ send的Linux C 函數

經套接字傳送消息
相關函數
sendto,sendmsg,recv,recvfrom,recvmsg,socket
表頭文件
#include < sys/socket.h >
定義函數
ssize_t send (int s,const void *msg,size_t len,int flags);
參數說明
第一個參數指定發送端套接字描述符;
第二個參數指明一個存放應用程式要發送數據的緩沖區;
第三個參數指明實際要發送的數據的字元數;
第四個參數一般置0。
函數說明
send() 用來將數據由指定的 socket 傳給對方主機。使用 send 時套接字必須已經連接。send 不包含傳送失敗的提示信息,如果檢測到本地錯誤將返回-1。因此,如果send 成功返回,並不必然表示連接另一端的進程接收數據。所保證的僅是當send 成功返回時,數據已經無錯誤地發送到網路上。
對於支持為報文設限的協議,如果單個報文超過協議所支持的最大尺寸,send 失敗並將 errno 設為 EMSGSIZE ;對於位元組流協議,send 會阻塞直到整個數據被傳輸。
flags 參數有如下的選擇:
MSG_DONTROUTE 勿將數據路由出本地網路
MSG_DONTWAIT 允許非阻塞操作(等價於使用O_NONBLOCK)
MSG_EOR 如果協議支持,此為記錄結束
MSG_OOB 如果協議支持,發送帶外數據
MSG_NOSIGNAL 禁止向系統發送異常信息
返回值
成功則返回實際傳送出去的字元數,失敗返回-1,錯誤原因存於errno 中。
錯誤代碼
EBADF 參數 s 非法的 socket 處理代碼。
EFAULT 參數中有一指針指向無法存取的內存空間。
WNOTSOCK 參數 s 為一文件描述詞,非 socket。
EINTR 被信號所中斷。
EAGAIN 此動作會令進程阻斷,但參數 s 的 socket 為不可阻斷的。
ENOBUFS 系統的緩沖內存不足。
EINVAL 傳給系統調用的參數不正確。

㈨ 在linux用c語言寫的socket傳文件。伺服器以二進制流打開文件並發送,客戶端接收並寫入文件。

傳輸的時候沒問題,主要是寫的時候,這有個文件編碼的問題,編碼統一就好了。

㈩ Linux下的c語言UDP編程

read是直接復讀取文件,scanf系列函數本身也製得用read讀取文件。

bind是把socket和地址關聯,INADDR_ANY的意思是任何地址。比如你的設備有很多ip,客戶端向其中任何一個發送數據你的socket都能接收到。相應地如果你bind一個確定的ip的話,向其他ip發送數據你的socket是接收不到的。

閱讀全文

與linuxcsendto相關的資料

熱點內容
java關閉class 瀏覽:165
除了迅雷還有哪些好用的app 瀏覽:155
犀牛建模新手教程視頻教程下載 瀏覽:345
相機磁吸數據線哪裡可以買到 瀏覽:265
自定義文件名 瀏覽:242
智能小車藍牙app 瀏覽:963
u盤文件過了一會自動消除 瀏覽:59
下載微信50版本到手機 瀏覽:529
js判斷是否為json數組 瀏覽:419
領克app啟動引擎後是什麼意思 瀏覽:936
iphone跑馬燈可以退貨嗎 瀏覽:770
西門子plc模擬量輸入怎麼編程 瀏覽:281
狂戰異界升級 瀏覽:380
亞索最初版本技能 瀏覽:602
程序鎖鎖不了簡訊 瀏覽:202
vue哪些情況可以更新數據 瀏覽:408
有數據如何自動畫幾何圖 瀏覽:662
不聯網的文件如何打開到u盤 瀏覽:907
標你妹上傳文件失敗 瀏覽:101
怎麼清除蘋果充值記錄 瀏覽:434

友情鏈接