當前位置:首頁 » 編程語言 » c語言timeout
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言timeout

發布時間: 2023-03-18 06:06:08

1. 實現雙機通信的c語言代碼

代碼要求是什麼? 基本實現 ping 的功能?

ping 代碼

#include <windows.h>
#include <winsock2.h>

#define IP_RECORD_ROUTE 0x7

#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

#define DEF_PACKET_SIZE 32 // Default packet size
#define MAX_PACKET 60000 // Max ICMP packet size 1024
#define MAX_IP_HDR_SIZE 60 // Max IP header size w/options

typedef struct _iphdr
{
unsigned int h_len:4; // Length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // Total length of the packet
unsigned short ident; // Unique identifier
unsigned short frag_and_flags; // Flags
unsigned char ttl; // Time to live
unsigned char proto; // Protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;
} IpHeader;

//
// ICMP header structure
//
typedef struct _icmphdr
{
BYTE i_type;
BYTE i_code; // Type sub code
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
// This is not the standard header, but we reserve space for time
ULONG timestamp;
} IcmpHeader;

//
// IP option header - use with socket option IP_OPTIONS
//
typedef struct _ipoptionhdr
{
unsigned char code; // Option type
unsigned char len; // Length of option hdr
unsigned char ptr; // Offset into options
unsigned long addr[9]; // List of IP addrs
} IpOptionHeader;

//
// Function: FillICMPData
//
// Description:
// Helper function to fill in various fields for our ICMP request
//
void FillICMPData(char *icmp_data, int datasize)
{
IcmpHeader *icmp_hdr = NULL;
char *datapart = NULL;

icmp_hdr = (IcmpHeader*)(icmp_data); //+sizeof(IpHeader)
icmp_hdr->i_type = ICMP_ECHO; // Request an ICMP echo
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);
//
// Place some junk in the buffer
//
memset(datapart,'E', datasize - sizeof(IcmpHeader));
}
//---------------------------------------------------------------------------

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 DecodeIPOptions(char *buf, int bytes, void CALLBACK (*pDis)(const char* szMes))
{
IpOptionHeader *ipopt = NULL;
IN_ADDR inaddr;
int i;
HOSTENT *host = NULL;
char szMesBuffer[255];
ipopt = (IpOptionHeader *)(buf + 20);

if (pDis != NULL)
{
pDis("RR: ");
}
for(i = 0; i < (ipopt->ptr / 4) - 1; i++)
{
inaddr.S_un.S_addr = ipopt->addr[i];
if (i != 0)
{
if (pDis != NULL)
{
pDis(" ");
}
}
host = gethostbyaddr((char *)&inaddr.S_un.S_addr, sizeof(inaddr.S_un.S_addr), AF_INET);
if (host)
{
if (pDis != NULL)
{
wsprintf(szMesBuffer, "(%-15s) %s", inet_ntoa(inaddr), host->h_name);
pDis(szMesBuffer);
}
}
else
{
if (pDis != NULL)
{
wsprintf(szMesBuffer, "(%-15s)", inet_ntoa(inaddr));
pDis(szMesBuffer);
}
}
}
return;
}
//---------------------------------------------------------------------------

int DecodeICMPHeader(char *buf, int bytes, struct sockaddr_in *from, void CALLBACK (*pDis)(const char* szMes))
{
IpHeader *iphdr = NULL;
IcmpHeader *icmphdr = NULL;
unsigned short iphdrlen;
DWORD tick;
static int icmpcount = 0;
char szMesBuffer[255];
char szMesBuffer1[255];

iphdr = (IpHeader *)buf;
// Number of 32-bit words * 4 = bytes
iphdrlen = iphdr->h_len * 4;
tick = GetTickCount();

if ((iphdrlen == MAX_IP_HDR_SIZE) && (!icmpcount))
DecodeIPOptions(buf, bytes, pDis);

if (bytes < iphdrlen + ICMP_MIN)
{
//printf("Too few bytes from %s\n", inet_ntoa(from->sin_addr));
if (pDis != NULL)
{
wsprintf(szMesBuffer, "Too few bytes from %s", inet_ntoa(from->sin_addr));
pDis(szMesBuffer);
}
}
icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY)
{
//printf("nonecho type %d recvd\n", icmphdr->i_type);
if (pDis != NULL)
{
wsprintf(szMesBuffer, "nonecho type %d recvd", icmphdr->i_type);
pDis(szMesBuffer);
}
return -1;
}
// Make sure this is an ICMP reply to something we sent!
//
if (icmphdr->i_id != (USHORT)GetCurrentProcessId())
{
//printf("someone else's packet!\n");
if (pDis != NULL)
{
pDis("someone else's packet!");
}
return -1;
}
//printf("%d bytes from %s:", bytes, inet_ntoa(from->sin_addr));
//printf(" icmp_seq = %d. ", icmphdr->i_seq);
//printf(" time: %d ms", tick - icmphdr->timestamp);
//printf("\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "%d bytes from %s:", bytes, inet_ntoa(from->sin_addr));
wsprintf(szMesBuffer1, " icmp_seq = %d. ", icmphdr->i_seq);
lstrcat(szMesBuffer, szMesBuffer1);
wsprintf(szMesBuffer1, " time: %d ms", tick - icmphdr->timestamp);
lstrcat(szMesBuffer, szMesBuffer1);
wsprintf(szMesBuffer1, " TTL = %d", iphdr->ttl);
lstrcat(szMesBuffer, szMesBuffer1);
pDis(szMesBuffer);
}

icmpcount++;
return tick - icmphdr->timestamp;
}
//---------------------------------------------------------------------------

ping(const char* szTargetAddress, int iDataSize, int iTimeOut, int iTimes, bool bReply, void CALLBACK (*pDis)(const char* szMes))
{
WSADATA wsaData;
SOCKET sockRaw = INVALID_SOCKET;
struct sockaddr_in dest,
from;
int bread,
fromlen = sizeof(from),
timeout = iTimeOut,
ret;
char *icmp_data = NULL,
*recvbuf = NULL;
unsigned int addr = 0;
USHORT seq_no = 0;
struct hostent *hp = NULL;
IpHeader ip_header;
IpOptionHeader ipopt;
char szMesBuffer[255];

if (timeout > 3000)
timeout = 3000;
else if (timeout < 100)
timeout = 100;

if (pDis != NULL)
{
wsprintf(szMesBuffer, "ping %s with %d bytes of data:", szTargetAddress, iDataSize);
pDis(szMesBuffer);
}

if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
//printf("WSAStartup() failed: %d\n", GetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "WSAStartup() failed: %d", GetLastError());
pDis(szMesBuffer);
}
return -1;
}

sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
if (sockRaw == INVALID_SOCKET)
{
//printf("WSASocket() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "WSASocket() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}

// Set the send/recv timeout values
//
bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if(bread == SOCKET_ERROR)
{
//printf("setsockopt(SO_RCVTIMEO) failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "setsockopt(SO_RCVTIMEO) failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
if (bread == SOCKET_ERROR)
{
//printf("setsockopt(SO_SNDTIMEO) failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "setsockopt(SO_SNDTIMEO) failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
memset(&dest, 0, sizeof(dest));
//
// Resolve the endpoint's name if necessary
//
dest.sin_family = AF_INET;
if ((dest.sin_addr.s_addr = inet_addr(szTargetAddress)) == INADDR_NONE)
{
if ((hp = gethostbyname(szTargetAddress)) != NULL)
{
memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
dest.sin_family = hp->h_addrtype;
//printf("dest.sin_addr = %s\n", inet_ntoa(dest.sin_addr));
if (pDis != NULL)
{
wsprintf(szMesBuffer, "dest.sin_addr = %s", inet_ntoa(dest.sin_addr));
pDis(szMesBuffer);
}
}
else
{
//printf("gethostbyname() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "gethostbyname() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
}
//
// Create the ICMP packet
//

int datasize = iDataSize;
if (datasize < 0)
datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

if (datasize > MAX_PACKET)
datasize = MAX_PACKET;

icmp_data = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
recvbuf = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_PACKET);
if (!icmp_data)
{
//printf("HeapAlloc() failed: %d\n", GetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "HeapAlloc() failed: %d", GetLastError());
pDis(szMesBuffer);
}
return -1;
}
//memset(icmp_data, 0, datasize); //, MAX_PACKET
FillICMPData(icmp_data, datasize);
//
// Start sending/receiving ICMP packets
//
int nCount = 0;
int iReceiveCount = 0;
if (iTimes < 2)
{
iTimes = 2;
}
while(1)
{
int bwrote;

if (nCount++ == iTimes)
break;

((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize);

bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest));
if (bwrote == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
//printf("timed out\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "timed out");
pDis(szMesBuffer);
}
continue;
}
//printf("sendto() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "sendto() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
if (bwrote < datasize)
{
//printf("Wrote %d bytes\n", bwrote);
if (pDis != NULL)
{
wsprintf(szMesBuffer, "Wrote %d bytes", bwrote);
pDis(szMesBuffer);
}
}
bread = recvfrom(sockRaw, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from, &fromlen);
if (bread == SOCKET_ERROR)
{
if (WSAGetLastError() == WSAETIMEDOUT)
{
//printf("timed out\n");
if (pDis != NULL)
{
wsprintf(szMesBuffer, "timed out");
pDis(szMesBuffer);
}
continue;
}
//printf("recvfrom() failed: %d\n", WSAGetLastError());
if (pDis != NULL)
{
wsprintf(szMesBuffer, "recvfrom() failed: %d", WSAGetLastError());
pDis(szMesBuffer);
}
return -1;
}
DecodeICMPHeader(recvbuf, bread, &from, pDis); //return replay time ms
iReceiveCount++;

Sleep(50);//1000
}
// Cleanup
//
if (sockRaw != INVALID_SOCKET)
closesocket(sockRaw);
HeapFree(GetProcessHeap(), 0, recvbuf);
HeapFree(GetProcessHeap(), 0, icmp_data);

WSACleanup();
if (pDis != NULL && bReply)
{
pDis(" ");
nCount--;
wsprintf(szMesBuffer, "Packets: Sent = %d, Received = %d, Lost = %d (%d%s", nCount, iReceiveCount, nCount - iReceiveCount, (nCount - iReceiveCount) * 100 / nCount, "% loss)");
pDis(szMesBuffer);
pDis(" ");
}

return 0;
}
//---------------------------------------------------------------------------

調用方法:

ping(
szTargetAddress, //目標地址 //IP 或網址
iDataSize, //數據包大小
iTimeOut, //延時
iTimes, //發送次數
bReply, //是否顯示信息
CALLBACK (*pDis)(const char* szMes)//顯示信息的函數指針
);

void pingMessage(const char* szMes);

main()
{
ping("127.0.0.1", 32, 500, 5, true, pingMessage);
}

void pingMessage(const char* szMes)
{
printf("%s\n", szMes);
}

2. 單片機裡面的C語言··不懂timecount++是什麼意思timecount--是什麼意思

timeout++ 意思是 timeout = timeout +1 意思是這個變數激則穗自加1;
--同明卜上;
timeout==0 返回一個bool值,如果兩者相等返回真或者非0.不相等返回假或者盯姿0

3. c語言小代碼一直說timeout。輸入年月,輸出天數。跪求大神給看看怎麼改

這是梁念顫我在ACM實驗試題中通橡敗過的程序。
你好像沒考慮年數對天數的影響。
#include <stdio.h>高明
int main()
{
int y, m, d, r, sum;
while(scanf("%d/%d/%d", &y, &m, &d) !=EOF)
{
switch(m)
{
case 1: sum=0;break;
case 2: sum=31;break;
case 3: sum=59;break;
case 4: sum=90;break;
case 5: sum=120;break;
case 6: sum=151;break;
case 7: sum=181;break;
case 8: sum=212;break;
case 9: sum=243;break;
case 10: sum=273;break;
case 11: sum=304;break;
case 12: sum=334;break;
default: printf("Data error!");break;
}
if((y%400==0) || (y%4==0&&y%100!=0)) r=1;
else r=0;
if(m>2) sum = sum+d+r;
else sum = sum+d;
printf("%d\n",sum);
}
return 0;
}

4. C語言如何控制文字輸出速度

顯示一行是和快的,至少肉眼感覺是這樣的。
在顯示完一行後,適當延時(延時方法可用循環語句來完成,時長通過改變循環終值來控制),再輸出下一行。

5. C語言 struct timeval timeout = ..; 是什麼意思啊

您可能都知道wu-ftp的格式化漏洞吧,呵呵,網路上的破壞程序多的是。有了破壞程序,可是怎麼找目標一試身手呢。因為我的工作平台是linux,所以掃描程序豐富程度比起windows下的遜輪局握多了。看著那些簡單操作的軟體,口水都流下來了(太誇張了!@~!#@!#)。所以,我只好自己動手寫了一個掃描匿名ftp伺服器的掃描器,是一個多線程的程序(不過掃描部分是從書上來的,可還是費了我不少工夫,總算學會了多線程編程)。可惜,它很傻,不能分辨是微軟的ftp還是unix的ftp。哎,我現在比較忙,先寫出來用了在說,等以後有時間我在加些像流光那樣的ftp簡單探測功能吧。以下是源程序。參數s是開始的ip,參數e是結束的ip,參數o是掃描結果存放的文件,如果不加的話,默認的文件名是host。因臘慶為比較懶,所以沒有寫ip的轉換函數,也就是大家只能寫數字ip了。不過大家有源碼,可以自己加嗎。順便附加一個在上找到的wu-ftp的exploit程序。針對linux(版本<=6.2)和freebsd的。
eg. #./scanftp -s 127.0.0.1 -e 127.0.65.255 -o host1

#include<pthread.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUF_LEN 255
#define THREADNUM 100 /*你想開的線程數,我的貓是56k的,memory是64,cpu比較慘超頻的賽揚450,我開*/ /*100個線臘液程時,cpu已全力運行,memory還有的剩,如果大家的機器比較爽,帶寬*/ /* 較大,那就可以多開了。視你自己的情況而定了。*/
#define NORM \"\\033[0m\"
#define GREEN \"\\033[32m\"
#define RED \"\\033[31m\"
#define BLUE \"\\033[34m\"
#define BROWN \"\\033[33m\"
#define time 10
extern int errno;
uint32_t startip,endip,k;
pthread_t thread[THREADNUM];
pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t file=PTHREAD_MUTEX_INITIALIZER;
char *filename=\"host\";
void usage(char *progname)
{
printf(BLUE \" Scananonymousftp is beta 1.0\\n\\n\"
RED \" 2001 by Tang Jing biao and cpu\\n\\n\"
GREEN \"usage: \" NORM \"%s [-s startip] [-e endip] [-o filename] [-h help]\\n\\n\",
progname
);

exit(-1);
}
void filewrite(char *name,char *ip)
{
char *p1,*p2,*p3;
FILE *fd;
int len1,len2;
p1=name;
p2=ip;
p3=\"\\n\";
printf(\"Ip is written!\\n\");
if((fd=fopen(p1,\"r+t\"))==NULL)
{
printf(\"Reading file was failed!\\n\");
exit(0);
}
fseek(fd,0L,SEEK_END);
len1=strlen(p2);
len2=strlen(p3);
fwrite(p2,sizeof(char),len1,fd);
fwrite(p3,sizeof(char),len2,fd);
if(fclose(fd))
printf(\"The file is not closed!\\n\");
}
void *scanhost()
{
struct sockaddr_in saddr;
int sockfd,flags,len,error,status,temp;
char buf[BUF_LEN],*hostip;
struct timeval timeout=;
fd_set wmask,rmask;
saddr.sin_port=htons(21);
saddr.sin_family=AF_INET;
pthread_mutex_lock(&mut);
while(k<=endip)
{
saddr.sin_addr.s_addr=htonl((uint32_t)k);
pthread_mutex_unlock(&mut);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf(\"Socket error!\\n\");
exit(-1);
}
printf(\"scanthread%d is scanning...%s at %d\\n\",pthread_self(),inet_ntoa(saddr.sin_addr),sockfd);
fflush(stdout);
FD_ZERO(&wmask);
FD_SET(sockfd,&wmask);
rmask=wmask;
timeout.tv_sec=time;
timeout.tv_usec=0;
status=fcntl(sockfd,F_GETFL);
fcntl(sockfd,F_SETFL,status|O_NONBLOCK);
temp=connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));

if(temp<0)
{
flags=select(sockfd+1,&rmask,&wmask,(fd_set *)NULL,&timeout);
if(flags<=0)
{
close(sockfd);
pthread_mutex_lock(&mut);
k++;
continue;
}
if(FD_ISSET(sockfd,&rmask)||FD_ISSET(sockfd,&wmask))
{
if(FD_ISSET(sockfd,&rmask)&&FD_ISSET(sockfd,&wmask))
{
len=sizeof(error);
temp=getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len);
if((temp!=0)||(error!=0))
{
close(sockfd);
pthread_mutex_lock(&mut);
k++;
continue;
}
}
}
}
可能都知道wu-ftp的格式化漏洞吧,呵呵,網路上的破壞程序多的是。有了破壞程序,可是怎麼找目標一試身手呢。因為我的工作平台是linux,所以掃描程序豐富程度比起windows下的遜多了。看著那些簡單操作的軟體,口水都流下來了(太誇張了!@~!#@!#)。所以,我只好自己動手寫了一個掃描匿名ftp伺服器的掃描器,是一個多線程的程序(不過掃描部分是從書上來的,可還是費了我不少工夫,總算學會了多線程編程)。可惜,它很傻,不能分辨是微軟的ftp還是unix的ftp。哎,我現在比較忙,先寫出來用了在說,等以後有時間我在加些像流光那樣的ftp簡單探測功能吧。以下是源程序。參數s是開始的ip,參數e是結束的ip,參數o是掃描結果存放的文件,如果不加的話,默認的文件名是host。因為比較懶,所以沒有寫ip的轉換函數,也就是大家只能寫數字ip了。不過大家有源碼,可以自己加嗎。順便附加一個在上找到的wu-ftp的exploit程序。針對linux(版本<=6.2)和freebsd的。
eg. #./scanftp -s 127.0.0.1 -e 127.0.65.255 -o host1

#include<pthread.h>
#include<sys/time.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUF_LEN 255
#define THREADNUM 100 /*你想開的線程數,我的貓是56k的,memory是64,cpu比較慘超頻的賽揚450,我開*/ /*100個線程時,cpu已全力運行,memory還有的剩,如果大家的機器比較爽,帶寬*/ /* 較大,那就可以多開了。視你自己的情況而定了。*/
#define NORM \"\\033[0m\"
#define GREEN \"\\033[32m\"
#define RED \"\\033[31m\"
#define BLUE \"\\033[34m\"
#define BROWN \"\\033[33m\"
#define time 10
extern int errno;
uint32_t startip,endip,k;
pthread_t thread[THREADNUM];
pthread_mutex_t mut=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t file=PTHREAD_MUTEX_INITIALIZER;
char *filename=\"host\";
void usage(char *progname)
{
printf(BLUE \" Scananonymousftp is beta 1.0\\n\\n\"
RED \" 2001 by Tang Jing biao and cpu\\n\\n\"
GREEN \"usage: \" NORM \"%s [-s startip] [-e endip] [-o filename] [-h help]\\n\\n\",
progname
);

exit(-1);
}
void filewrite(char *name,char *ip)
{
char *p1,*p2,*p3;
FILE *fd;
int len1,len2;
p1=name;
p2=ip;
p3=\"\\n\";
printf(\"Ip is written!\\n\");
if((fd=fopen(p1,\"r+t\"))==NULL)
{
printf(\"Reading file was failed!\\n\");
exit(0);
}
fseek(fd,0L,SEEK_END);
len1=strlen(p2);
len2=strlen(p3);
fwrite(p2,sizeof(char),len1,fd);
fwrite(p3,sizeof(char),len2,fd);
if(fclose(fd))
printf(\"The file is not closed!\\n\");
}
void *scanhost()
{
struct sockaddr_in saddr;
int sockfd,flags,len,error,status,temp;
char buf[BUF_LEN],*hostip;
struct timeval timeout=;
fd_set wmask,rmask;
saddr.sin_port=htons(21);
saddr.sin_family=AF_INET;
pthread_mutex_lock(&mut);
while(k<=endip)
{
saddr.sin_addr.s_addr=htonl((uint32_t)k);
pthread_mutex_unlock(&mut);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf(\"Socket error!\\n\");
exit(-1);
}
printf(\"scanthread%d is scanning...%s at %d\\n\",pthread_self(),inet_ntoa(saddr.sin_addr),sockfd);
fflush(stdout);
FD_ZERO(&wmask);
FD_SET(sockfd,&wmask);
rmask=wmask;
timeout.tv_sec=time;
timeout.tv_usec=0;
status=fcntl(sockfd,F_GETFL);
fcntl(sockfd,F_SETFL,status|O_NONBLOCK);
temp=connect(sockfd,(struct sockaddr *)&saddr,sizeof(saddr));

if(temp<0)
{
flags=select(sockfd+1,&rmask,&wmask,(fd_set *)NULL,&timeout);
if(flags<=0)
{
close(sockfd);
pthread_mutex_lock(&mut);
k++;
continue;
}
if(FD_ISSET(sockfd,&rmask)||FD_ISSET(sockfd,&wmask))
{
if(FD_ISSET(sockfd,&rmask)&&FD_ISSET(sockfd,&wmask))
{
len=sizeof(error);
temp=getsockopt(sockfd,SOL_SOCKET,SO_ERROR,&error,&len);
if((temp!=0)||(error!=0))
{
close(sockfd);
pthread_mutex_lock(&mut);
k++;
continue;
}
}
}
}
bzero(buf,BUF_LEN);
fcntl(sockfd,F_SETFL,status);
if((len=read(sockfd,buf,BUF_LEN))>=0)
{
if(strncmp(buf,\"220\",3)==0)
{
write(sockfd,\"user anonymous\\n\",15);
if((len=read(sockfd,buf,BUF_LEN))>=0)
{
if(strncmp(buf,\"331\",3)==0)
{
write(sockfd,\"pass shit@\\n\",11);
if((len=read(sockfd,buf,BUF_LEN))>=0)
{
if(strncmp(buf,\"230\",3)==0)
{
printf(\"%d HaHa! find ! Ip is %s\\n\",pthread_self(),inet_ntoa(saddr.sin_addr));
hostip=inet_ntoa(saddr.sin_addr);
pthread_mutex_lock(&file);
filewrite(filename,hostip);
pthread_mutex_unlock(&file);
fflush(stdout);
close(sockfd);
}
}
}
}
}
}

close(sockfd);
pthread_mutex_lock(&mut);
k++;
}
pthread_mutex_unlock(&mut);
pthread_exit(NULL);

}

int create_thread()
{
int i=0,temp;
for(i=0;i<THREADNUM;i++)
{
pthread_mutex_lock(&mut);
if(k>endip)
{
pthread_mutex_unlock(&mut);
break;
}
pthread_mutex_unlock(&mut);
pthread_create(&thread[i],NULL,scanhost,NULL);
pthread_mutex_lock(&mut);
k++;
pthread_mutex_unlock(&mut);
}
temp=i;
for(i=0;i<temp;i++)
{
pthread_join(thread[i],NULL);
printf(\"scanthread %d is closed!\\n\",i);
}
return i;
}

int main(int argc,char *argv[])
{
char c ;
FILE *fdmain;
int thnum;
if(argc<2)
{
printf(\"Please input parameter! Type -h\\n\");
exit(0);
}
while ((c = getopt(argc, argv, \"s:e:o:h\")) != EOF)
{
switch (c)
{
case \'s\':
startip=ntohl(inet_addr(optarg));
break;
case \'e\':
endip=ntohl(inet_addr(optarg));
break;
case \'o\':
filename = optarg;
break;
case \'h\':
usage(argv[0]);
break;
default:
break;
}
}
if(startip>endip)
{
k=startip;
startip=endip;
endip=k;
}
k=startip;
if((fdmain=fopen(filename,\"w+t\"))==NULL)
{
printf(\"The file was not opened!!!!!\\n\");
exit(0);
}
fclose(fdmain);
printf(\"The main process created %d thread \\n\",THREADNUM);
pthread_mutex_init(&mut,NULL);
pthread_mutex_init(&file,NULL);
thnum=create_thread();
printf(\"The main process is closed.\\n\");
}
希望被採納
祝您好運!~

6. C語言中想要一個循環程序在2秒內結束,用哪個函數,怎麼用讓一個循環程序運行一次就結束,該怎麼編程!

2秒的應該要用定時器好一點吧,while(!兩秒標志)這樣就可以了(兩秒定時一到,則置位兩秒標志位),如果真的對實時性要求非常高的話,就是說兩秒一到,不管程序執行到哪裡,都應該結束這個循環,那就要用到任務的調度了,這個比較麻煩,因為會涉及到操作系統了,uC/OS可以實現這個。至於你說的讓循環程序執行一次就結束的,既然是只有一次,那就不叫循環了對吧,不要循環,直接順序執行下來就是一次了嘛

7. C語言,計時器

秒錶計時器的代碼
#include
<stdio.h>
#include
<conio.h>
#include
<windows.h>
#include
<stdlib.h>
struct
tm
//定義時間結構體,包括時分秒和10毫秒
{
int
hours,minutes,seconds;
int
hscd;
}time,tmp,total;
//time用以計時顯示,tmp用以存儲上一階段時間,total記總時間
int
cnt;
FILE*
fout;
//每次調用update函數,相當於時間過了10ms
void
update(struct
tm
*t)
{
(*t).hscd++;
//10ms單位時間加1
cnt++;
if
((*t).hscd==100)
//計時滿1s,進位
{
(*t).hscd=0;
(*t).seconds++;
}
if
((*t).seconds==60)
//計時滿一分,進位
{
(*t).seconds=0;
(*t).minutes++;
}
if
((*t).minutes==60)
//計時滿一小時,進位
{
(*t).minutes=0;
(*t).hours++;
}
if((*t).hours==24)
(*t).hours=0;
//delay();
Sleep(10);
//Sleep是windows提供的函數,作用是暫停程序,單位毫秒,所以此處暫停10ms
}
void
display(struct
tm
*t)
{
//此處輸出計時結果,\r為回車不換行,既一直在同一行更新時間
printf("%d:",(*t).hours);
printf("%d:",(*t).minutes);
printf("%d:",(*t).seconds);
printf("%d\r",(*t).hscd);
//printf("Now,
press
『e』
key
to
stop
the
clock…");
}
void
time_init()
//初始化時間
{
time.hours=time.minutes=time.seconds=time.hscd=0;
}
void
get_total()
//計算總時間
{
total.hscd
=
cnt
%
100;
cnt
/=
100;
total.seconds
=
cnt
%
60;
cnt
/=
60;
total.minutes
=
cnt
%
60;
cnt
/=
60;
total.hours
=
cnt;
}
int
main()
{
char
m;
time_init();
cnt
=
0;
fout
=
fopen("timeout.txt","w");
printf("按回車鍵開始計時!\n");
while(1)
{
m
=
getch();
if(m
!=
『\r』)
//讀入一個輸入,如果是回車,那麼跳出次循環
printf("輸入錯誤,僅能輸入回車鍵!\n");
else
break;
}
printf("已經開始計時,但是你可以按回車鍵以分段計時!\n");
while(1)
{
if(kbhit())
//此處檢查是否有鍵盤輸入
{
m=getch();
if(m
==
『\r』)
//如果等於回車,那麼計時結束,跳出循環
break;
else
if(m
==

『)
//如果等於空格,顯示此次計時,初始化計時器
{
tmp
=
time;
//記錄上一段計時器結果
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);
//寫入文件
time_init();
printf("\n");
}
else
{
printf("輸入錯誤,僅支持輸入回車鍵或者空格鍵!\n");
}
}
update(&time);
//更新計時器
display(&time);
//顯示計時器時間
}
tmp
=
time;
//輸出最後一次即使結果,寫入文件
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);
get_total();
//計算總的時間,顯示,並寫入文件
printf("\n總時間:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fprintf(fout,"統計時間:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fclose(fout);
printf("已經保存到當前目錄下的timeout.txt文件中按任意鍵結束!");
getch();
}

8. 如何用C語言編程,使出現一個界面幾秒後自動跳到另一個界面;求高手解答。

你的界面指什麼界面???控制台還是應用程序界面??
給個代碼你參考下吧,是秒錶計時器程序的代碼
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
struct tm //定義時間結構體,包括時分秒和10毫秒
{
int hours,minutes,seconds;
int hscd;
}time,tmp,total; //time用以計時顯示,tmp用以存儲上一階段時間,total記總時間
int cnt;

FILE* fout;
//每次調用update函數,相當於時間過了10ms
void update(struct tm *t)
{

(*t).hscd++; //10ms單位時間加1
cnt++;
if ((*t).hscd==100) //計時滿1s,進位
{
(*t).hscd=0;
(*t).seconds++;
}
if ((*t).seconds==60) //計時滿一分,進位
{
(*t).seconds=0;
(*t).minutes++;
}
if ((*t).minutes==60) //計時滿一小時,進位

{
(*t).minutes=0;
(*t).hours++;
}
if((*t).hours==24) (*t).hours=0;
//delay();
Sleep(10); //Sleep是windows提供的函數,作用是暫停程序,單位毫秒,所以此處暫停10ms
}
void display(struct tm *t)
{
//此處輸出計時結果,\r為回車不換行,既一直在同一行更新時間
printf("%d:",(*t).hours);
printf("%d:",(*t).minutes);
printf("%d:",(*t).seconds);
printf("%d\r",(*t).hscd);
//printf("Now, press 『e』 key to stop the clock…");
}
void time_init() //初始化時間
{
time.hours=time.minutes=time.seconds=time.hscd=0;
}
void get_total() //計算總時間
{
total.hscd = cnt % 100;
cnt /= 100;
total.seconds = cnt % 60;
cnt /= 60;
total.minutes = cnt % 60;
cnt /= 60;
total.hours = cnt;
}
int main()
{
char m;
time_init();
cnt = 0;
fout = fopen("timeout.txt","w");
printf("按回車鍵纖仔毀開始計時!\n");
while(1)
{
m = getch();
if(m != 『\r』) /戚橘/讀入一個輸入,如果是回車,那麼跳出次循環
printf("輸入錯誤,僅能輸入回車鍵!\n");
else
break;
}
printf("已經開始計時,但是你可以按回車鍵以分段計時!\n");
while(1)
{
if(kbhit()) //此處檢查是否有鍵盤輸入
{
m=getch();
if(m == 『\r』) //如果等於回車,那麼計時結束,跳出循環
break;
else if(m == 『 『) //如果等於空格,顯示此次計時,初始化計時器
{
tmp = time; //記錄上一段計時器結果
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd); //寫入文件
time_init();
printf("\n");
}
else
{
printf("輸入錯誤,僅支持輸入回車毀備鍵或者空格鍵!\n");
}
}
update(&time); //更新計時器
display(&time); //顯示計時器時間
}
tmp = time; //輸出最後一次即使結果,寫入文件
fprintf(fout,"%d:%d:%d:%d\n",tmp.hours,tmp.minutes,tmp.seconds,tmp.hscd);
get_total(); //計算總的時間,顯示,並寫入文件
printf("\n總時間:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fprintf(fout,"統計時間:%d:%d:%d:%d\n",total.hours,total.minutes,total.seconds,total.hscd);
fclose(fout);
printf("已經保存到當前目錄下的timeout.txt文件中按任意鍵結束!");
getch();

}

9. C語言socket編程中setsockopt設置超時時間對read無效

不要用read,陸帆橋改用recv()函數進行接收試試看吧。
如果實早猛在沒效果,把socket一開始就設置為非阻塞模式吧轎咐:
u_long mode = 1;
ioctlsocket(fd,FIONBIO,&mode);